2015-05-14 14 views
1

在我的大腦,執行以下操作:Python的應用re.sub沒有返回比賽

>>> re.sub('([eo])', '_\1_', 'aeiou') 

應該返回:

'a_e_i_o_u' 

而是返回:

'a_\x01_i_\x01_u' 

我敢肯定,我我的腦部抽筋,但我不能爲我的生活找出什麼是錯的。

回答

4

\1產生\x01 Python字符串文字。雙斜線,或使用原始字符串字面量:

>>> import re 
>>> re.sub('([eo])', '_\1_', 'aeiou') 
'a_\x01_i_\x01_u' 
>>> re.sub('([eo])', '_\\1_', 'aeiou') 
'a_e_i_o_u' 
>>> re.sub('([eo])', r'_\1_', 'aeiou') 
'a_e_i_o_u' 

The Backslash Plague在Python正則表達式HOWTO:

如前所述,正則表達式用反斜槓字符('\')來表示特殊格式或允許使用特殊字符而不用調用它們的特殊含義。這與Python在字符串文字中用於相同目的的相同字符的使用相沖突。

2

使用原始字符串R:

re.sub('([eo])', r'_\1_', 'aeiou') 

輸出:

In [3]: re.sub('([eo])', r'_\1_', 'aeiou') 
Out[3]: 'a_e_i_o_u' 
In [4]: "\1" 
Out[4]: '\x01' 
In [5]: r"\1" 
Out[5]: '\\1' 
+0

腦抽筋確實如此。謝謝。 – prooffreader

+0

@prooffreader,無後顧之憂,做出簡單的錯誤。 –