Je souhaite remplacer tous les espaces (sauf \n) par "". J'ai essayé d'utiliser l'expression régulière avec \s+ mais cela correspond également au caractère de nouvelle ligne.

Existe-t-il une méthode pour ignorer \n dans \s dans l'expression régulière?

1
user2550098 7 mars 2016 à 10:53

5 réponses

Meilleure réponse

Si vous n'avez pas à penser à Unicode, vous pouvez utiliser

[ \t\r\f\v]

Ou, puisque \v correspond à un VT (symbole vertical, \x0b), \r est également considéré comme un saut de ligne, et \f est également une sorte d'espace blanc vertical (plutôt obsolète maintenant - (flux de formulaire, \x0c):

[ \t]

Voir les docs:

\s
Lorsque l'indicateur UNICODE n'est pas spécifié, il correspond à n'importe quel caractère d'espacement, cela équivaut à l'ensemble [ \t\n\r\f\v]. L'indicateur LOCALE n'a aucun effet supplémentaire sur la correspondance de l'espace. Si UNICODE est défini, cela correspondra aux caractères [ \t\n\r\f\v] plus tout ce qui est classé comme espace dans la base de données des propriétés des caractères Unicode.

Si vous devez prendre en charge tous les espaces Unicode, utilisez

\s(?<!\n)

Cette expression correspondra à tout espace qui n'est pas un saut de ligne.

Voir la démo regex

Un autre exemple de la façon d'ajouter une restriction à une classe de caractères abrégée positive , est d'utiliser son contraire à l'intérieur d'une classe de caractères inversée. \S est la classe de caractères raccourcie opposée pour \s, donc, nous devons la mettre dans [^...] et * ajouter le caractère de \s que nous devons exclure:

[^\S\n]

Ajoutez \r, \v, etc. si vous devez exclure tous les sauts de ligne. Le [^\S\n] correspond à tout caractère autre qu'un espace non blanc (= correspond à n'importe quel espace) et à un caractère de saut de ligne.

2
Wiktor Stribiżew 7 mars 2016 à 11:44

Il est dit dans le document que \s correspond à [ \t\n\r\f\v]. Il vous suffit donc de remplacer "\ s +" par [\ t \ r \ f \ v] + pour ignorer \ n.

1
piglei 7 mars 2016 à 08:01

Existe-t-il une méthode pour ignorer \n dans \s dans l'expression régulière?

Vous pouvez utiliser l'anticipation négative.

re.sub(r'(?!\n)\s', '', s)

Si vous souhaitez également ignorer le retour chariot, ajoutez \r à l'intérieur de l'anticipation négative.

re.sub(r'(?!\n|\r)\s', '', s)

C'est comme une sorte de soustraction. c'est-à-dire qu'au-dessus de l'expression régulière, soustraire \n, \r de \s

0
Avinash Raj 7 mars 2016 à 08:00

\s correspond à [\r\n\t\f ], si vous ne voulez que des espaces, vous pouvez utiliser ce qui suit:

>>> re.sub(' ', '', 'test   string\nwith  new line')

Puisque ' ' correspond à un espace (littéralement), cela supprimera tous les espaces mais gardera le caractère \n.

0
Maroun 7 mars 2016 à 07:59

Vous pouvez utiliser la classe de caractères inversés [^\S\n]\S est tout ce qui n'est pas un espace:

re.sub(r'[^\S\n]', '', s)
1
Casimir et Hippolyte 7 mars 2016 à 08:17