1
在我的大腦,執行以下操作:Python的應用re.sub沒有返回比賽
>>> re.sub('([eo])', '_\1_', 'aeiou')
應該返回:
'a_e_i_o_u'
而是返回:
'a_\x01_i_\x01_u'
我敢肯定,我我的腦部抽筋,但我不能爲我的生活找出什麼是錯的。
在我的大腦,執行以下操作:Python的應用re.sub沒有返回比賽
>>> re.sub('([eo])', '_\1_', 'aeiou')
應該返回:
'a_e_i_o_u'
而是返回:
'a_\x01_i_\x01_u'
我敢肯定,我我的腦部抽筋,但我不能爲我的生活找出什麼是錯的。
\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在字符串文字中用於相同目的的相同字符的使用相沖突。
使用原始字符串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'
腦抽筋確實如此。謝謝。 – prooffreader
@prooffreader,無後顧之憂,做出簡單的錯誤。 –