[Python使用OR时不匹配

问题描述 投票:0回答:1

我正在尝试从以下字符串中匹配日期(在这种情况下为数字):

mystring = '_20180701_20190630'

我正在使用以下代码:

re.findall(r'(?:\A|_){1}([0-9]{4}[_]{0,1}[0-9]{2}[_]{0,1}[0-9]{2})(?:$|_){1}', mystring)

对于这个示例,我正在寻找的模式过于复杂,因为我还需要考虑其他更复杂的情况。

给我,我不明白为什么上面的模式不匹配最后一个数字,而后面的一个匹配(唯一不同的是最后一个字符:(?:$){1} vs (?:$ | _){1}):

re.findall(r'(?:\A|_){1}([0-9]{4}[_]{0,1}[0-9]{2}[_]{0,1}[0-9]{2})(?:$){1}', mystring) 

为什么OR运算符阻止匹配?是因为它很贪心,而且之前还有另一个数字吗?

python regex expression
1个回答
0
投票

您的正则表达式实际上是在匹配并且使用了结尾的_,而该匹配失败了必须以_开头的下一个匹配。

您可以使用超前解决此问题:

(?:\A|_)(\d{4}_?\d{2}_?\d{2})(?=_|\Z)

RegEx Demo

[通过使用正向外观,即(?=_|\Z),我们仅断言_\Z的存在,但并未真正匹配它。

我还重构了您的正则表达式以简化操作。可以删除{1},而仅用{0.1}替换?(可选匹配项)。同样,[_]可以只是_,而[0-9]可以缩写为\d

© www.soinside.com 2019 - 2024. All rights reserved.