Python regex, supprimer toute ponctuation sauf le trait d'Union pour la chaîne unicode
j'ai ce code pour supprimer toute ponctuation d'une chaîne regex:
import regex as re
re.sub(ur"p{P}+", "", txt)
Comment puis-je le changer pour permettre les traits d'Union? Si tu pouvais expliquer comment tu l'as fait, ce serait génial. Je comprends cela ici, corrigez-moi si je me trompe, P avec quelque chose après il est ponctuation.
3 réponses
[^\P{P}-]+
\P
est le complément de \p
- pas de signes de ponctuation. Donc ceci correspond à tout ce qui est (pas de ponctuation ni de tiret) - résultant en toute ponctuation sauf les tirets.
exemple:http://www.rubular.com/r/JsdNM3nFJ3
si vous voulez une façon non-alambiquée, une alternative est \p{P}(?<!-)
: faites correspondre toute la ponctuation, puis vérifiez que ce n'était pas un tiret (en utilisant lookbehind négatif).
Exemple de travail: http://www.rubular.com/r/5G62iSYTdk
Voici comment le faire avec le re
module, dans le cas où vous devez coller avec les 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 est importante, vous pouvez utiliser str.translate
, car c'est plus rapide que d'utiliser une regex. En 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 la livraison d'une fonction à la place de la chaîne de remplacement:
re.sub(r"\p{P}", lambda m: "-" if m.group(0) == "-" else "", text)