J'ai ce code pour supprimer toute la ponctuation d'une chaîne d'expression régulière:
import regex as re
re.sub(ur"\p{P}+", "", txt)
Comment pourrais-je le changer pour autoriser les tirets? Si vous pouviez expliquer comment vous l'avez fait, ce serait formidable. Je comprends qu'ici, corrigez-moi si je me trompe, P avec quoi que ce soit après c'est la ponctuation.
[^\P{P}-]+
\P
Est le complément de \p
- pas de ponctuation. Donc, cela correspond à tout ce qui est pas (pas de ponctuation ou un tiret) - résultant en toute ponctuation sauf les tirets.
Exemple: http://www.rubular.com/r/JsdNM3nFJ
Si vous voulez une méthode non alambiquée, une alternative est \p{P}(?<!-)
: correspond à toutes les ponctuations, puis vérifiez que ce n'était pas un tiret (en utilisant un lookbehind négatif).
Exemple de travail: http://www.rubular.com/r/5G62iSYTdk
Voici comment le faire avec le module re
, 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 les performances sont importantes, vous voudrez peut-être utiliser str.translate
, Car c'est plus rapide que d'utiliser une expression régulière . Dans Python 3, le code est txt.translate({ord(char): None for char in remove})
.
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)