Python re.sub() 的怪异现象
我刚开始学习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 个回答
re.sub(pattern, repl, string, count=0, flags=0)
这是re.sub()的用法。
你提到的标志re.M,应该写成flags=re.M,不然Python会把它当成你在说count=re.M。
试试看吧,这是我能给出的唯一建议。
另外,给我一个你searchString变量可能包含的内容的例子。
问题在于,如果你把一个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>'
。