/ / Regex Python, supprime toute ponctuation sauf le trait d'union pour la chaîne Unicode - python, regex, chaîne

Regex Python, supprime toute ponctuation sauf le trait d'union pour la chaîne Unicode - python, regex, chaîne

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)