re.sub不替换字符串

时间:2014-12-15 09:15:21

标签: python regex string

以下代码是否有错误?

import re
text = 'AFL_v_CalcOneIntAreas (%as_Points[0].ub_X%);\n'

print(re.sub('as_Points[0].ub_X', '0x00', text))

预期输出

AFL_v_CalcOneIntAreas (%0x00%);

但实际输出与输入字符串相同,请告诉我为什么它会像这样?

5 个答案:

答案 0 :(得分:3)

您应该逃避[].

>>> re.sub('as_Points\[0\]\.ub_X', '0x00', text)

.表示“任何字符”,[0]仅匹配“0”。

您也可以这样做:

esc = re.escape('as_Points[0].ub_X')  # now '[0]' is treated like the string
                                      # literal '[0]' and not the regex '[0]'
re.sub(esc, '0x00', text)

访问re module以获取更多有用的功能。

答案 1 :(得分:2)

您在正则表达式中搜索特殊字符。你必须逃脱它们。

text = 'AFL_v_CalcOneIntAreas (%as_Points[0].ub_X%);\n'
print(re.sub('as_Points\[0\]\.ub_X', '0x00', text))

答案 2 :(得分:2)

符号[]表示正则表达式中的某些内容,您必须将其转义:

>>> re.sub('as_Points\[0\]\.ub_X', '0x00', text)
'AFL_v_CalcOneIntAreas (%0x00%);\n'
例如,

[a-z]表示所有低位字母。 [...]用于表示“其中的任何内容”,因此[01]代表0或1 在您的情况下,'as_Points[0].ub_X'实际上是'as_Points0.ub_X'

请注意,.也有特殊含义。这意味着1个角色。你也应该逃避它。


如果你不知道你的表达式是否包含你应该逃脱的字符,你可以使用re.escape

>>> someExpression = "as_Points[0].ub_X"
>>> re.escape(someExpression)
'as\\_Points\\[0\\]\\.ub\\_X'
>>> re.sub(re.escape(someExpression), '0x00', text)
'AFL_v_CalcOneIntAreas (%0x00%);\n'

但是如果你不需要正则表达式,那么字符串就有了替换方法:

text.replace('as_Points[0].ub_X','0x00')

答案 3 :(得分:2)

如果您正在使用正则表达式,则需要使用反斜杠转义[]之类的字符,因为它们具有特殊含义。

但是您不需要使用正则表达式来替换文字字符串。只需使用replace

print(text.replace('as_Points[0].ub_X','0x00'))

答案 4 :(得分:1)

您需要转发[]以及点.

print(re.sub('as_Points\[0\]\.ub_X', '0x00', text))
# prints: AFL_v_CalcOneIntAreas (%0x00%);