2014-01-18 12 views
15

Ich habe diesen Code für alle Satzzeichen aus einer regex Zeichenfolge zu entfernen:Python Regex, entfernen Sie alle Satzzeichen außer Bindestrich für Unicode-String

import regex as re  
re.sub(ur"\p{P}+", "", txt) 

Wie würde ich es ändern Bindestriche zu erlauben? Wenn Sie erklären könnten, wie Sie es gemacht haben, wäre das großartig. Ich verstehe, dass hier, korrigieren Sie mich, wenn ich falsch liege, P mit etwas, nachdem es Interpunktion ist.

+3

@Jerry - Ich sah ein wenig und fand dies: http://StackOverflow.com/a/4316097/7586 - Dies ist "Regex", nicht "Re". Ich nehme an, sie haben zwei. – Kobi

+0

@Kobi Oh ... ich denke, das erklärt es. – Jerry

Antwort

18
[^\P{P}-]+ 

\P ist die komplementäre von \p - nicht Interpunktion. Das entspricht also allem, was nicht ist (keine Interpunktion oder ein Bindestrich) - was zu allen Interpunktionen außer Bindestrichen führt.

Beispiel: http://www.rubular.com/r/JsdNM3nFJ3

Wenn Sie eine nicht-gewundenen Weg wollen, eine Alternative ist \p{P}(?<!-): alle Interpunktion übereinstimmen, und dann überprüfen, war kein Bindestrich (mit negativen Lookbehind).
Arbeitsbeispiel: http://www.rubular.com/r/5G62iSYTdk

+1

Großartig, danke. Was ist mit dem Ausschließen von mehreren? Sowie '.' auch. – John

+1

@Anonymous - Der erste wäre '[^ \ P {P} \ -.] +', Und der zweite '\ p {P} (? Kobi

+0

Warum war es notwendig, '\' jetzt nach {P} zu haben und nicht in der ersten? – John

0

Sie entweder die Interpunktion Sie manuell entfernen möchten angeben könnten, wie in [._,] oder eine Funktion anstelle der Ersatzzeichenfolge liefern:

re.sub(r"\p{P}", lambda m: "-" if m.group(0) == "-" else "", text) 
6

Hier ist, wie es zu tun mit dem re Modul, falls Sie mit den Standardbibliotheken zu halten haben:

# 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' 

Wenn Leistung zählt, Sie str.translate verwenden möchten, da it's faster than using a regex. In Python 3 lautet der Code txt.translate({ord(char): None for char in remove}).

+1

're' bezieht sich hier auf [dieses Modul] (https://pypi.python.org/pypi/regex), das' \ p' hat. –

Verwandte Themen