2016-11-30 4 views
0

So möchte ich Gruppe von Satzzeichen aus dem Text mit Leerzeichen trennen.Python, wie Interpunktion von Text zu trennen

my_text = "!where??and!!or$$then:)" 

Ich möchte ein ! where ?? and !! or $$ then :) als Ergebnis haben.

Ich wollte etwas wie in Javascript, wo Sie $1 verwenden können, um Ihre passende Zeichenfolge zu erhalten. Was ich bisher versucht haben:

my_matches = re.findall('[!"\$%&\'()*+,\-.\/:;=#@?\[\\\]^_`{|}~]*', my_text) 

my_matches Hier ist leer, also musste ich \\\ aus dem Ausdruck löschen:

my_matches = re.findall('[!"\$%&\'()*+,\-.\/:;=#@?\^_`{|}~]*', my_text) 

Ich habe dieses Ergebnis:

['!', '', '', '', '', '', '??', '', '', '', '!!', '', '', '$$', '', '', '', '', 
':)', ''] 

Also ich löschen Alle redundanten Eintrag wie folgt:

my_matches_distinct = list(set(my_matches)) 

Und ich habe ein besseres Ergebnis:

['', '??', ':)', '$$', '!', '!!'] 

Dann ersetze ich jedes Spiel von ihm selbst und Raum:

for match in my_matches: 
if match != '': 
    my_text = re.sub(match, ' ' + match + ' ', my_text) 

Und natürlich arbeitet es nicht! Ich habe versucht, das Match als String zu interpretieren, aber es funktioniert auch nicht ... Wenn ich versuche, den String direkt zu setzen, funktioniert es zwar.

Aber ich denke, ich mache es nicht richtig, weil ich Probleme mit '!' und '!!' Recht?

Thanks :)

+0

Es wird empfohlen, rohe Stringliterale zu verwenden, wenn ein RegexMuster definieren. Außerdem sollten Sie keine willkürlichen Symbole in einer Zeichenklasse entkommen lassen, nur "' '' 'muss immer maskiert werden und andere können so platziert werden, dass sie nicht maskiert werden müssen. Außerdem entspricht Ihre Regex einer leeren Zeichenkette - und tut es auch - aufgrund von '*'. Ersetzen durch '+' Quantifizierer. –

+0

Wenn Sie diese Symbole aus Ihrer Zeichenfolge entfernen möchten, warum verwenden Sie 're.findall' überhaupt? –

+0

Weil ich vor und nach diesen Symbolgruppen Platz machen will und ich weiß nicht, wie ich das speichern soll? – MlleStrife

Antwort

1

Es wird empfohlen, rohe Stringliterale zu verwenden, wenn ein RegexMuster definieren. Entkommen Sie auch nicht willkürlichen Symbolen innerhalb einer Zeichenklasse, nur \ muss immer maskiert werden, und andere können platziert werden, so dass sie nicht entkommen müssen. Außerdem stimmt Ihre Regex-Datei mit einer leeren Zeichenfolge überein - und zwar aufgrund von *. Ersetzen durch + Quantifizierer. Wenn Sie diese Symbole aus Ihrer Zeichenfolge entfernen möchten, verwenden Sie direkt re.sub.

import re 
my_text = "!where??and!!or$$then:)" 
print(re.sub(r'[]!"$%&\'()*+,./:;=#@?[\\^_`{|}~-]+', r' \g<0> ', my_text).strip()) 

Siehe Python demo

Einzelheiten: Die []!"$%&\'()*+,./:;=#@?[\^_`{|}~-]+ paßt zu jedem 1+ Symbole aus der Menge (beachten Sie, dass nur \ ist hier entkam seit - am Ende verwendet wird, und ] zu Beginn die Klasse), und der Ersatz fügt ein Leerzeichen + die ganze Übereinstimmung (die \g<0> ist die Rückreferenz für das ganze Spiel) und ein Leerzeichen ein. Und .strip() wird führende/nachgestellte Leerzeichen entfernen, nachdem die reguläre Zeichenfolge die Verarbeitung der Zeichenfolge beendet.

+1

Nochmals vielen Dank und Entschuldigung für meine ungeschickte Frage :( – MlleStrife

0

Verwenden Sie sub() Methode in re Bibliothek. Sie können dies wie folgt tun,

import re 
str = '!where??and!!or$$then:)' 
print re.sub(r'([[email protected]#%\^&\*\(\):;"\',\./\\]+)', r' \1 ', str).strip() 

Ich hoffe, dass dieser Code Ihr Problem lösen sollte. Wenn Sie mit regex offensichtlich sind, dann ist der Regex-Teil keine große Sache. Es ist nur die richtige Funktion zu verwenden.

Hoffe, das hilft! Bitte kommentieren Sie, wenn Sie Fragen haben. :)


Referenzen:

Python re library

Verwandte Themen