J'ai ce code pour supprimer toute ponctuation d'une chaîne regex:
import regex as re
re.sub(ur"p{P}+", "", txt)
Comment pourrais-je le changer pour autoriser les traits d'union? Si vous pouviez expliquer comment vous l'avez fait, ce serait formidable. Je comprends qu’ici, corrige-moi si je me trompe, P avec quoi que ce soit après que c’est la ponctuation.
Réponses:
21 pour la réponse № 1[^P{P}-]+
P
est la complémentaire de p
- pas de ponctuation. Donc, cela correspond à tout ce qui est ne pas (pas de ponctuation ou un tiret) - entraînant toutes les ponctuations sauf les tirets.
Exemple: http://www.rubular.com/r/JsdNM3nFJ3
Si vous voulez une manière non compliquée, une alternative est p{P}(?<!-)
: associez toute la ponctuation, puis vérifiez que ce n’est pas un tiret (en utilisant une apparence négative).
Exemple de travail: http://www.rubular.com/r/5G62iSYTdk
10 pour la réponse № 2
Voici comment faire avec le re
module, au cas où vous devriez vous en tenir aux bibliothèques standard:
# works in python 2 and 3
import re
import string
remove = string.punctuation
remove = remove.replace("-", "") # don"t remove hyphens
pattern = r"[{}]".format(remove) # create the pattern
txt = ")*^%{}[]thi"s - is - @@#!a !%%!!%- test."
re.sub(pattern, "", txt)
# >>> "this - is - a - test"
Si la performance compte, vous pouvez utiliser str.translate
, depuis c'est plus rapide que d'utiliser un regex. En Python 3, le code est txt.translate({ord(char): None for char in remove})
.
0 pour la réponse № 3
Vous pouvez soit spécifier la ponctuation que vous souhaitez supprimer manuellement, comme dans [._,]
ou fournissez une fonction à la place de la chaîne de remplacement:
re.sub(r"p{P}", lambda m: "-" if m.group(0) == "-" else "", text)