我正在尝试匹配以下字符串中的日期(本例中为数字):
mystring = '_20180701_20190630'
我正在使用以下代码:
re.findall(r'(?:\A|_){1}([0-9]{4}[_]{0,1}[0-9]{2}[_]{0,1}[0-9]{2})(?:$|_){1}', mystring)
对于这个例子,我正在寻找的模式过于复杂,因为我还需要考虑其他更复杂的情况。
鉴于此,我不明白为什么上面的模式与最后一个数字不匹配,而下面的模式却匹配(唯一的区别是最后一个字符:(?:$){1} 与 (?:$|_){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
。
关于python - 使用 OR 时 re 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59254286/