我有以下形式的日期字符串2022年4月8日和一个正则表达式来尝试匹配它们中的任何一个
re.findall(r"(d{1,2})?.*(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december).*(202d)?", str)
问题是,如果是str = '8 april 2022'
,它将返回('8', 'april', '')
所以我的问题是:为什么?
忽略了202d
的1次出现?非常感谢。
编辑。带非贪婪.*?
re.findall(r"(d{1,2}).*?(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december).*?(202d)?", str)
它仍然无法捕获2022
编辑2。考虑到答案,一个更好的问题是:有没有一种方法可以说"嘿,regex 1的出现是可选的,但比0更可取"?
.*
应该很少使用,因为在匹配month
之后的贪婪.*
与匹配过多,并且在第三捕获组中一年没有留下任何匹配项。此外,您只需要在字符串之间匹配1+个空格。重要的是,通过使用如下所示的非捕获组,使月份和年份之间的零件可选。
您可以将此正则表达式与非可选匹配、单词边界和一些调整一起使用:
b(?:(d{1,2}) +)?(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december)(?: +(202d))?
RegEx演示
.*
与" 2022"
匹配,然后(202d)?
与""
匹配,因为这是可选的,没有任何剩余。
.*?
匹配""
,然后(202d)?
匹配""
,因为这是可选的,而剩余的" 2022"
甚至不以2
开头。
你希望它能进一步搜索,使(202d)?
与"2022"
匹配,但为什么要进一步搜索?它已经找到了匹配项,所以它停止并报告。
在正则表达式模式.*(202d)?
的最后一部分,2022被.*
捕获,因此(202d)
没有捕获任何内容。
这是供你细读的,但可能并不是你想要的那样。
matches = re.findall(r"(?:d{0,2}s*)(?:januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december)(?:s202d)?", str)
对于3 mei woensdag 2022
,这可能不是你想要的,但它应该适用于今年:
matches = re.findall(r"(?:d{0,2}s*)(?:w+s*)+(?:s*202d)?", str)