2013-03-08 20 views
9

Ich habe die folgende reguläre Ausdruck Substitution ersetzen:Verwenden von regulären Ausdrücken überlappende Teilmuster

input=re.sub(r"([a-zA-Z0-9])\s+([a-zA-Z0-9])" , r"\1*\2" , input) 

Ich benutze den regulären Ausdruck auf der Saite "3 a 5 b".

Ich bekomme zurück "3*a 5*b".

Ich denke, ich sollte zurück "3*a*5*b" bekommen.

Also irgendwie stören meine regulären Ausdruck Ersetzungen einander.

Was kann ich tun, um das gewünschte Ergebnis zu erhalten, außer iterativen Läufen des regulären Ausdrucks?

+0

input = re ("", "*", input) - das bringt dir was du willst – PurityLake

+1

Nein, @PurityLake, tut es nicht. Das würde zu einem fehlerhaften Ersatz in der Zeichenfolge "3/a 5! B" führen. – Richard

+0

Entschuldigung, ich habe nur gedacht, dass Sie die Leerzeichen durch "*" ersetzen wollten. – PurityLake

Antwort

18

Verwenden Sie ein lookahead assertion, (?=...), um nicht das zweite Muster zu essen:

In [33]: re.sub(r"([a-zA-Z0-9])\s+(?=[a-zA-Z0-9])" , r"\1*" , '3 a 5 b') 
Out[33]: '3*a*5*b' 

In [32]: re.sub(r"([a-zA-Z0-9])\s+(?=[a-zA-Z0-9])" , r"\1*" , "3 /a 5! b") 
Out[32]: '3 /a*5! b' 
+0

@StevenRumbalski: Danke! – unutbu

+0

Und ** erinnern **, wenn Sie eine (Gruppe) in ein (= Lookahead) ändern, existiert die (Gruppe) nicht mehr. Deshalb gibt es kein 2 in dieser Antwort. –

1

Reguläre Ausdrücke sind nicht immer das beste Werkzeug für den Job bei der Verwendung von Python. Für den Fall, dass Sie oben beschreiben, bietet Python eine viel einfachere, lesbare und besser verwaltbar Methode:

>>> s = "3 a 5 b" 
>>> '*'.join(s.split()) 
'3*a*5*b' 
+0

Eine nette Antwort - leider hat der O.P. seine Bedürfnisse in den Kommentaren aktualisiert. Dies beantwortet jedoch die ursprüngliche Frage. – jsbueno

+0

Die Zeichenklasse '[a-zA-Z0-9]' schließt das Ersetzen des Leerzeichens, wenn es zwischen einer Vielzahl von Zeichen liegt, klar aus, während die vorgeschlagene Antwort dies nicht tut. – Richard

+0

Ah ja, der Beitrag wurde aktualisiert ich sehe. Angesichts der neuen Informationen klingt eine Lookahead-Behauptung tatsächlich wie die beste Antwort für mich. –

Verwandte Themen