>>> 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 |_
.
John: merci pour la réponse, je voudrais savoir quelle est la différence entre $ et \ Z? – killown
-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é. –
plus précisément: "OU juste avant A NEWLINE AT ..." –