2010-08-25 4 views

Répondre

5
>>> import re 
>>> test = "i am test-ing., i am test.ing-, i am_, test_ing," 
>>> re.sub(r'([^\w\s]|_)+(?=\s|$)', '', test) 
'i am test-ing i am test.ing i am test_ing' 

correspond à un ou plusieurs caractères non alphanumériques ([^\w\s]|_) suivi d'un espace (\s) ou de la fin de la chaîne ($). La construction (?=) est une assertion lookahead: elle s'assure qu'un espace correspondant n'est pas inclus dans la correspondance, donc elle n'est pas remplacée; Seul le [\W_]+ est remplacé.

D'accord, mais pourquoi [^\w\s]|_, demandez-vous? La première partie correspond à tout élément qui n'est pas alphanumérique ou un caractère de soulignement ([^\w]) ou un espace ([^\s]), c'est-à-dire des caractères de ponctuation. Sauf que nous voulons éliminer les caractères de soulignement, nous incluons donc ceux avec |_.

+0

John: merci pour la réponse, je voudrais savoir quelle est la différence entre $ et \ Z? – killown

+1

-1 Normalement (non-MULTILINE) il y a * une * différence; '$' correspond perlishly à la fin de la chaîne d'entrée OU UN NEWLINE À LA FIN DE LA CHAÎNE. '\ Z 'ne correspond qu'à la fin de la chaîne, ce qui correspond généralement au comportement souhaité. –

+1

plus précisément: "OU juste avant A NEWLINE AT ..." –

Questions connexes