将表达式与至少前缀和/或后缀匹配,而不重复表达式

时间:2017-06-02 22:44:51

标签: regex python-3.6 simplify

让我们说

((pre)(expr)(post)?|(pre)?(expr)(post))

这意味着将expr与至少一个前缀或后缀或两者匹配,但两者都不匹配。

preexpr - OK
exprpost - OK
preexprpost - OK
expr - BAD

此示例使用字母,但所有三个子表达式都可以是任何有效的正则表达式,而不仅仅是字母。

有没有办法编写一个等效的正则表达式,每个表达式只出现一次?我试图提高可读性。

现在我知道我可以删除第二次出现的pre

((pre)(expr)(post)?|(expr)(post))

但我想知道它是否还能减少。

谢谢

1 个答案:

答案 0 :(得分:1)

- 这是为条件构造(?(n)yes regex|no regex)制作的。

在我看来,条件的唯一值是通过或失败 基于 匹配的内容匹配。

在这种情况下,以下正则表达式检查可选组1或3是否匹配 实际上,' pre'和'发布'可以是幽默的子表达 (但要注意回溯陷阱)。

这样可以节省多个子表达式。

https://regex101.com/r/QdhRn2/1

(pre)?(expr)(post)?(?(1)|(?(3)|(?!)))

解释

 ( pre )?                      # (1), Optional 'pre'
 ( expr )                      # (2), Required 'exp'
 ( post )?                     # (3), Optional 'post'
                               # Post mortum
 (?(1)                         # Did group 1 match ?
   |  (?(3)                         # No, then did group 3 match ?
        |  (?!)                          # No.  Fail the whole thing
      )
 )
 # Here, at least group 1 or 3 matched, possibly both

Explained Verbose

 ( pre )?                      # (1), Optional 'pre'
 ( expr )                      # (2), Required 'exp'
 ( post )?                     # (3), Optional 'post'
                               # Post mortum
 (?(1)                         # Did group 1 match ?
                                    # Yes, all done
   |                              # or,
      (?(3)                         # No, then did group 3 match ?
                                         # Yes, all done
        |                              # or,
           (?!)                          # No.  Fail the whole thing
      )
 )
 # Here, at least group 1 or 3 matched, possibly both