gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:04:14 25 4
gpt4 key购买 nike

我被难住了。我正在编写 Python 3.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。莫名其妙。我认为这可能是贪婪与占有等,但是 - 将 @message 更改为 message 并且由此产生的行为否定了这一点。谁能解释一下?我正在尝试对 SQL 进行一些基本的文本解析,以重构大量文件的消息格式。我使用 regexr.com 对我所做的大部分正则表达式进行原型(prototype)设计,它还在该行中发现了三个模式。谢谢。

最佳答案

参见 the documentation . re.sub 的第四个参数是 count,而不是 flags。因为 re.IGNORECASE 恰好是 2,所以您告诉它只进行两次替换。相反,通过关键字传递 flags:

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

关于Python re.sub 的行为不同于 re.findall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45558109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com