2009-07-30 14 views
1

Ich versuche, Python re Funktion zu verwenden, um etwas Text zu ersetzen.Python: number Backreference in re

>>> import re 
>>> text = "<hi type=\"italic\"> the></hi>" 
>>> pat_error = re.compile(">(\s*\w*)*>") 
>>> pat_error.search(text) 
<_sre.SRE_Match object at 0xb7a3fea0> 
>>> re.sub(pat_error, ">\1", text) 
'<hi type="italic">\x01</hi>' 

Danach wird der Wert des Textes sollte

"<hi type="italic"> the</hi>" 
+0

Das ist wirklich keine Frage ist ... –

Antwort

9

Zwei Fehler in Ihrem Code sein. Zuerst Sie passende nicht (und insbesondere die Erfassung), was Sie denken, dass Sie passendes und erfassen - einfügen nach dem Aufruf .search:

>>> _.groups() 
('',) 

Die ungezwungene Wiederholung der Wiederholungen (Stern nach einer Erfassungsgruppe mit nichts als Sterne) passt einmal zu viel zusammen - mit der leeren Saite am Ende dessen, was du denkst, dass du mit ihm übereinstimmst - und das wird gefangen genommen. Fix von mindestens einer der Stars auf ein Plus zu ändern, zum Beispiel durch:

>>> pat_error = re.compile(r">(\s*\w+)*>") 
>>> pat_error.search(text) 
<_sre.SRE_Match object at 0x83ba0> 
>>> _.groups() 
(' the',) 

nun diese Spiele und fängt vernünftig. Zweitens, Sie verwenden keine rohe String-Literal-Syntax, wo Sie sollten, so dass Sie keinen Backslash haben, wo Sie denken, Sie haben einen - Sie haben eine Escape-Sequenz \1, die die gleiche wie CHR (1) ist. Fix von roher Stringliteral Syntax, also nach dem oben Schnipsel

>>> pat_error.sub(r">\1", text) 
'<hi type="italic"> the</hi>' 

Alternativ Sie alle Ihrer Schrägstriche verdoppeln könnten, zu vermeiden, dass sie als Beginn Escape-Sequenzen genommen werden - aber, rohe Stringliteral Syntax viel besser lesbar.

0
>>> text.replace("><", "<") 
'<hi type="italic"> the</hi>' 
+0

Das wird nicht funktionieren, weil es andere Fälle, in denen der Wert des Textes sein könnte „ Sachen blah“ – Daniel