Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python re.sub的行为与re.findall不同_Python - Fatal编程技术网

Python re.sub的行为与re.findall不同

Python re.sub的行为与re.findall不同,python,Python,我被难住了。我正在编写Python3.6.2,使用PyCharm作为我的IDE。以下脚本片段说明了我的问题: 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[

我被难住了。我正在编写Python3.6.2,使用PyCharm作为我的IDE。以下脚本片段说明了我的问题:

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
函数两次。如果我将
@message
更改为
message
,则
re.sub
仍会调用
dosubst
两次,但会拾取
@arg1
@arg2
。莫名其妙。我原以为这可能是贪婪vs.posessive等等,但将
@message
更改为
message
,结果行为否定了这一点。有人能解释一下吗?我正在尝试对SQL进行一些基本的文本解析,以重构大量文件的消息格式。我使用regexr.com对我所做的大部分regex工作进行了原型化,它还发现该模式在行中出现了三次。谢谢。

请参阅。
re.sub
的第四个参数是
count
,而不是
flags
。因为
re.IGNORECASE
恰好是2,所以您告诉它只做两次替换。而是通过关键字传递
标志

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

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

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

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