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



我有以下形式的日期字符串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)

相关内容

  • 没有找到相关文章

最新更新