47 votes

Supprimez les espaces en Python à l'aide de string.whitespace

String.whitespace is great de Python:

 >>> string.whitespace
'\t\n\x0b\x0c\r '
 

Comment utiliser ceci avec une chaîne sans avoir recours à la saisie manuelle dans '\ t | \ n | ... etc pour regex?

Par exemple, il devrait être capable de tourner: "S'il vous plaît \ n ne me faites pas de mal à \ x0b."

dans

"S'il te plaît, ne me fais pas de mal."

Je préférerais probablement conserver les espaces simples, mais il serait assez facile d'aller simplement string.whitespace [: - 1] Je suppose.

144voto

bobince Points 270740

Il existe un raccourci spécial pour ce cas d'utilisation!

Si vous appelez str.split sans argument, il est divisé en espaces blancs au lieu de caractères uniques. Alors:

 >>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
 

14voto

Imran Points 20117

Quel est le problème avec la classe de caractères \s ?

 >>> import re

>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
 

9voto

John Machin Points 39706

Nous allons faire quelques hypothèses raisonnables:

(1) Vous voulez vraiment pour remplacer n'importe quelle course de caractères espace avec un seul espace (une course est de longueur 1 ou plus).

(2) Vous souhaitez le même code pour travailler avec un minimum de changements sous Python 2.X avec unicode objets.

(3) Vous ne voulez pas que votre code de supposer des choses qui ne sont pas garantis dans les docs

(4) Vous voulez le même code pour travailler avec un minimum de changements avec Python 3.X str objets.

Actuellement choisi la solution a ces problèmes:

(a) variation " " * 3 de " " * 2 - dire qu'il supprime les doublons des espaces mais pas en triple, quadruple, etc espaces. [échoue exigence 1]

(b) variation "foo\tbar\tzot" de "foobarzot" [échoue exigence 1]

(c) lorsque nourris avec un objet unicode, reçoit TypeError: translate() takes exactly one argument (2 given) [échoue exigence 2]

(d) les utilisations string.whitespace[:-1] [n'est pas le point 3); l'ordre des caractères dans la chaîne.les espaces ne sont pas garantis]

(e) les utilisations string.whitespace[:-1] [n'est pas l'exigence 4; en Python 2.X, string.les espaces sont '\t\n\x0b\x0c\r '; en Python 3.X, c'est '\t\n\r\x0b\x0c']

L' " ".join(s.split()) de réponses et l' re.sub(r"\s+", " ", s) de réponses n'ont pas ces problèmes.

2voto

Tor Valamo Points 14209

Vous pouvez utiliser la méthode de traduction

 import string

s = "Please \n don't \t hurt \x0b me."
s = s.translate(None, string.whitespace[:-1]) # python 2.6 and up
s = s.translate(string.maketrans('',''), string.whitespace[:-1]) # python 2.5, dunno further down
>>> s
"Please  don't  hurt  me."
 

Et puis supprimez les espaces en double

 s.replace('  ', ' ')
>>> s
"Please don't hurt me."
 

1voto

miku Points 63392

un point de départ .. (bien que ce ne soit pas plus court que l'assemblage manuel du cirque d'espaces blancs) ..

 >>> from string import whitespace as ws
>>> import re

>>> p = re.compile('(%s)' % ('|'.join([c for c in ws])))
>>> s = "Please \n don't \t hurt \x0b me."

>>> p.sub('', s)
"Pleasedon'thurtme."
 

Ou si vous souhaitez réduire les espaces à un maximum:

 >>> p1 = re.compile('(%s)' % ('|'.join([c for c in ws if not c == ' '])))
>>> p2 = re.compile(' +')
>>> s = "Please \n don't \t hurt \x0b me."

>>> p2.sub(' ', p1.sub('', s))
"Please don't hurt me."
 

Troisième voie, plus compacte:

 >>> import string

>>> s = "Please \n don't \t hurt \x0b me."
>>> s.translate(None, string.whitespace[])
"Pleasedon'thurtme."

>>> s.translate(None, string.whitespace[:5])
"Please  don't  hurt  me."

>>> ' '.join(s.translate(None, string.whitespace[:5]).split())
"Please don't hurt me."
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X