2009-07-30 101 views
1

我試圖用python的re.sub函數來替換一些文本。Python:數字re.sub中的反向引用

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

之後文本的價值應該在你的代碼

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

這真的不是問題... – 2009-12-18 19:58:17

回答

9

的兩個問題。首先,你不匹配(具體而言,捕獲)你認爲你匹配和捕獲 - 您的電話後插入到.search

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

重複的無約束的重複(捕獲組與後星除了星星之外)只有一次匹配太多 - 空白字符串在你認爲你匹配的結尾 - 這就是捕獲的結果。通過改變星星的至少一個有加,例如,通過修復:

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

現在這匹配和明智地捕獲。其次,你不應該在你應該使用原始字符串文字的語法,所以你沒有反斜槓,你認爲你有一個 - 你有一個轉義序列\1這是一樣的chr(1)。通過使用原始字符串文本語法修復,上面的代碼中

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

或者你可能會增加一倍你所有的反斜線之後即避免它們被視爲轉義序列的開始 - 但,原始字符串字面語法更可讀。

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

這將無法正常工作,因爲有其他情況下,文本的值可能是「東西等等」 – Daniel 2009-07-30 03:11:35