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.

19
demandé sur John 2014-01-18 23:48:01

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

21
répondu Kobi 2017-05-09 19:19:12

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

11
répondu Galen Long 2017-05-23 12:03:04

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)
0
répondu Cu3PO42 2014-01-18 19:57:12