我正在尝试从以下字符串中匹配日期(在这种情况下为数字):
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运算符阻止匹配?是因为它很贪心,而且之前还有另一个数字吗?
您的正则表达式实际上是在匹配并且使用了结尾的_
,而该匹配失败了必须以_
开头的下一个匹配。
您可以使用超前解决此问题:
(?:\A|_)(\d{4}_?\d{2}_?\d{2})(?=_|\Z)
[通过使用正向外观,即(?=_|\Z)
,我们仅断言_
或\Z
的存在,但并未真正匹配它。
我还重构了您的正则表达式以简化操作。可以删除{1}
,而仅用{0.1}
替换?
(可选匹配项)。同样,[_]
可以只是_
,而[0-9]
可以缩写为\d
。