web-dev-qa-db-fra.com

Python regex, supprime toute ponctuation sauf le trait d'union pour la chaîne unicode

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.

22
John
[^\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

22
Kobi

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}).

14
Galen Long

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)
0
Cu3PO42