繁体   English   中英

Python 正则表达式与 0 或 1 次出现运算符不匹配 1 次出现?

[英]Python regex doesnt match 1 occurrence with 0 or 1 occurrences operator?

我有以下 forms '8 april 2022'、'8 april'、'april' 的日期字符串和一个正则表达式来尝试匹配其中的任何一个

re.findall(r"(\d{1,2})?.*(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december).*(202\d)?", str)

问题是,如果str = '8 april 2022' ,它将返回('8', 'april', '')所以我的问题是:为什么会这样? 忽略202\d的 1 次出现? 谢谢你。

编辑。 不贪心.*?

re.findall(r"(\d{1,2}).*?(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december).*?(202\d)?", str)

它仍然没有捕捉到 2022

编辑 2. 考虑到答案,一个更好的问题是:有没有办法说“嘿,正则表达式 1 的出现是可选的,但比 0 更可取”?

.*应该很少使用,因为贪婪.*在匹配month之后匹配太多并且在一年的第三个捕获组中没有留下任何匹配项。 此外,您只需要匹配字符串之间的 1+ 个空格。 通过使用如下所示的非捕获组,使月份和年份之间的部分成为可选非常重要。

您可以将此正则表达式与非可选匹配、单词边界和一些调整一起使用:

\b(?:(\d{1,2}) +)?(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december)(?: +(202\d))?

正则表达式演示

.*匹配" 2022" ,然后匹配(202\d)? 匹配"" ,因为它是可选的并且没有任何剩余。

.*? 匹配""然后匹配(202\d)? 匹配"" ,因为它是可选的,而剩余的" 2022"甚至不以2开头。

您希望它进一步搜索以便(202\d)? 匹配"2022" ,但为什么要进一步搜索? 它已经找到了匹配项,因此它会停止并报告该匹配项。

在您的正则表达式模式的最后一部分.*(202\d)? , 2022 被.*捕获,因此(202\d)什么也没捕获。

这是供您阅读的,但可能与您想要的不完全一样。

matches = re.findall(r"(?:\d{0,2}\s*)(?:januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december)(?:\s202\d)?", str)

对于3 mei woensdag 2022 ,这可能不是您想要的,但它应该适用于这一年:

matches = re.findall(r"(?:\d{0,2}\s*)(?:\w+\s*)+(?:\s*202\d)?", str)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM