[英]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.