2017-08-08 60 views
2

我难倒。我编写Python 3.6.2,使用PyCharm作为我的IDE。下面的脚本片段展示了我的问题:Python的应用re.sub行为不同于re.findall

def dosubst(m): 
    return m.group() + "X" 

line = r"set @message = formatmessage('%s %s', @arg1, @arg2);" 
m = re.findall(r"@\w+\b", line, re.IGNORECASE) 
print(m[0]) # prints "@message" 
print(m[1]) # prints "@arg1" 
print(m[2]) # prints "@arg2" 

foo = re.sub(r"@\w+\b", dosubst, line, re.IGNORECASE) 
print(foo) # prints "set @messageX = formatmessage('%s %s', @arg1X, @arg2);" 

你可以看到,re.findall发现的三场比赛。然而,re.sub仅调用dosubst功能两次。如果我改变@messagemessage然后re.sub仍称dosubst两次,但拿起@arg1@arg2。百思不得其解。我想这可能是贪婪与posessive等,但 - 改变@messagemessage和产生的行为否定这一点。谁能解释一下?我正在尝试对SQL进行一些基本的文本解析,以重构大量文件的消息格式。我使用regexr.com为我制作的大部分正则表达式原型创建了原型,并且还发现了该行中的三个模式。谢谢。

回答

6

the documentation。第四个参数re.subcount,不flags。由于re.IGNORECASE恰好是2,因此您只是告诉它只做两次替换。取而代之的是,通过关键词传递flags

>>> re.sub(r"@\w+\b", dosubst, line, flags=re.IGNORECASE) 
"set @messageX = formatmessage('%s %s', @arg1X, @arg2X);" 
0

通过给第四个参数count=0。如果您将其他正数替换为0,那么它会将字符串替换为完全相同的时间数。

foo = re.sub(r"@\w+\b", dosubst, line, 0, re.IGNORECASE) 
print(foo) 

输出:

"set @MessageX = formatmessage('%s %s', @arg1X, @arg2X);"