re.sub无法替换字符串

3
以下代码中是否有错误?
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个回答

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模块获取更多有用的函数。


假设搜索字符串存储在一个变量中,而我不知道变量中'['或']'的位置,是否有其他原始字符串机制可以实现相同的功能? - Bharadwaj

2

您在正则表达式中寻找特殊字符。您需要对它们进行转义。

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

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'

请注意,.也有特殊含义。它代表一个字符。您还应该转义它。


如果您不知道您的表达式中是否包含需要转义的字符,则可以使用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'

但是如果你不需要正则表达式的能力,字符串有一个替换方法:replace。

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

假设搜索字符串被存储在一个变量中,我不知道变量中 '[' 或 ']' 的位置,是否有其他原始字符串机制可以实现同样的功能? - Bharadwaj
@Bharadwaj,我已经更新了我的答案。你可以使用re.escape函数。 - fredtantini

2
如果您使用正则表达式,需要使用反斜杠转义字符[]等特殊字符,因为它们具有特殊含义。
但是,如果要替换一个字面字符串,您不需要使用正则表达式。只需使用replace即可:
print(text.replace('as_Points[0].ub_X','0x00'))

1

您需要转义 [] 以及点号 .:

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

你忘记转义点号了。 - dotcomly
@Dotcomsuperstar 在这个例子中并不重要,但是你发现了。谢谢。 - Marcin
@Marcin 在这种情况下为什么 . 不重要?即使 . 是 re 中的特殊字符吗? - Bharadwaj
它很特殊。但在这种情况下,“.”将匹配任何字符,而不仅仅是点。这不会改变这个特定的例子。但一般来说,最好当然要转义它。 - Marcin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接