Python re.sub()古怪

时间:2013-03-05 14:54:08

标签: python regex

我是Python的新手,实际上这是我的第一个脚本。

我正在努力使用Python的正则表达式。具体来说是re.sub()

我有以下代码:

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

通过此操作,我尝试在host": "${9:example.com}"内匹配searchString之类的内容,并将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 个答案:

答案 0 :(得分:8)

问题是在variableTest中放置IP会导致替换字符串如下:

r'\18.8.8.8\2'

如您所见,第一组引用是指第18组,而不是第1组。因此,re会抱怨无效的组引用。

在这种情况下,您希望改为使用\g<n> syntax

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

产生例如r'\g<1>8.8.8.8\g<2>'

答案 1 :(得分:1)

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

这是re.sub()

的语法

你似乎在调用标志re.M的方式,应该像flags = re.M,否则python会把它当作你的意思是count = re.M

尝试一下,因为这是我唯一可以决定的事情

还举例说明了您的searchString变量可能包含的内容