使用连续 \d 和 \w 时了解正则表达式的行为 [重复]

Posted

技术标签:

【中文标题】使用连续 \\d 和 \\w 时了解正则表达式的行为 [重复]【英文标题】:Understanding behavior of regex when using consecutive \d and \w [duplicate]使用连续 \d 和 \w 时了解正则表达式的行为 [重复] 【发布时间】:2021-01-25 03:51:42 【问题描述】:

我试图了解regex 在连续使用\d\w 来匹配句子中的单词和数字时的行为。我搜索了类似的问题,但找不到合适的匹配项(如果有重复,请告诉我)。

# Example sentence
"Adam has 100 friends. Bill has 23 friends. Cindy has 5 friends."

当我使用正则表达式 [A-Za-z]+\s\w+\s\d+\w 时,它会返回匹配项:

Adam has 100 Bill has 23

但不适合

Cindy has 5

因为贪婪搜索的数字 (\d+) 后面没有任何单词字符 (\w),所以我本来预计根本没有匹配项;它们后面跟着一个空格。我认为,不知何故,\w 在第一次出现任何数字之后匹配数字。我以为\d+ 会用尽搜索中的数字。你能帮我理解这里发生了什么吗?

谢谢

【问题讨论】:

您能说明一下您期望得到什么样的答案吗?解释模式是如何工作的?那就看regex101.com/r/LWD5hM/1/debugger 你好维克托。我最初并不理解这种行为,因为我不知道回溯以通过贪婪匹配来容纳更多的查询模式。下面的答案澄清了这一点。感谢您的链接! 【参考方案1】:

我认为 \d+ 会用尽搜索中的数字长度

不,事实并非如此。 \d+ 在下一个 \w 之前匹配尽可能多的数字(也匹配数字,即[a-zA-Z_0-9])强制正则表达式引擎回溯一个位置,以便\w 可以匹配一个单词字符。

如果您不希望发生这种回溯,请使用possessive quantifier ++

[A-Za-z]+\s\w+\s\d++\w

但请注意,\d++w 模式在所有 3 种情况下总是会失败,因为 \d++ 不会回溯,\w 将永远无法匹配数字。

这种模式只有在结尾有像Chapter is 23A这样的非数字单词字符时才会成功。

RegEx Demo

【讨论】:

因为并非所有正则表达式都支持所有格量​​词,所以原子组可能是更通用的解决方案。 是的,但即使是原子组也不支持所有正则表达式风格 @Atakan:仅供参考[A-Za-z]+\s\w+\s(?>\d+)\w 是使用原子组的正则表达式

以上是关于使用连续 \d 和 \w 时了解正则表达式的行为 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式,限制连续两个横杆(--)

python 正则表达式

python 正则表达式

正则表达式

数据的查找和提取[1]——正则表达式

python模块--re