Python re.sub没有返回匹配

时间:2015-05-14 13:12:32

标签: python regex

在我的大脑中,以下内容:

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

应该返回:

'a_e_i_o_u'

而是返回:

'a_\x01_i_\x01_u'

我确定我有脑痉挛,但我不能为我的生活找出错误。

2 个答案:

答案 0 :(得分:4)

\1在Python字符串文字中生成\x01。将斜杠加倍,或使用原始字符串文字:

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

请参阅Python regex HOWTO中的The Backslash Plague

  

如前所述,正则表达式使用反斜杠字符('\')来表示特殊表单或允许使用特殊字符而不调用它们的特殊含义。这与Python在字符串文字中用于相同目的的相同字符的使用相冲突。

答案 1 :(得分: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'