Python re.sub() 的怪异现象

6 投票
2 回答
1816 浏览
提问于 2025-04-17 18:00

我刚开始学习Python,实际上这是我写的第一个脚本。

我在使用Python的正则表达式时遇到了一些困难,特别是re.sub()这个函数。

我有以下这段代码:

variableTest = "192"
test = re.sub(r'(\$\{\d{1,2}\:)example.com(\})', r'\1' + variableTest + r'\2', searchString, re.M )

我想要在searchString中找到类似host": "${9:example.com}"的内容,并把example.com替换成一个服务器名称或IP地址。

但是如果variableTest里面是一个IP地址,替换就失败了。我收到了一个错误信息:sre_constants.error: invalid group reference

我测试过variableTest的值,分别是"127.0.0.1"、"1"、"192"和"192.168"。只有"127.0.0.1"能正常工作,其他的都不行。如果我在其他值前面加一个字母,它们也能正常工作。

variableTest是一个字符串,我用type(variableTest)确认过了。

我完全搞不懂这是为什么。

如果我在替换字符串中去掉r'\1',它也能正常工作。r'\1'会包含${\d}:,其中\d是一个1到999之间的数字。

任何帮助都会非常感谢!

2 个回答

1

re.sub(pattern, repl, string, count=0, flags=0)

这是re.sub()的用法。

你提到的标志re.M,应该写成flags=re.M,不然Python会把它当成你在说count=re.M。

试试看吧,这是我能给出的唯一建议。

另外,给我一个你searchString变量可能包含的内容的例子。

8

问题在于,如果你把一个IP地址放进 variableTest,那么会生成一个像这样的替换字符串:

r'\18.8.8.8\2'

你可以看到,第一个组的引用是指第18组,而不是第1组。因此,re 会报错,说这个组引用无效。

在这种情况下,你需要使用 \g<n> 这种写法

r'\g<1>' + variableTest + r'\g<2>'

这样生成的字符串比如说是 r'\g<1>8.8.8.8\g<2>'

撰写回答