python - 使用 OR 时 re 不匹配

标签 python regex expression

我正在尝试匹配以下字符串中的日期(本例中为数字):

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)

RegEx Demo

通过使用正向查找,即 (?=_|\Z),我们仅断言 _\Z 的存在,但是不太匹配。

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

关于python - 使用 OR 时 re 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59254286/

相关文章:

python - CSS 或 xpath :select the first 2 elements

python - 根据用户输入获取对象的物理 map 位置

css - 使用正则表达式将 CSS 分解成 block

autocomplete - 当用作多种类型的静态扩展时限制宏函数的自动完成

c++ - 什么可以是子表达式?

传递函数参数时的 C++ 执行顺序

python - 如何在python的同一类中调用静态方法

python - 如何在 Python 中读取大文件的特定部分

php - PHP中的正则表达式过滤@name或@name.lastname

python - 正则表达式匹配字符串的结尾