RegEx:可选不起作用

时间:2017-09-26 11:59:03

标签: python regex

我是regex的新手。我找到了解决以下问题的解决方案,但我想知道为什么我的第一个代码段无效:

假设我想与(Python)正则表达式c[a]c[b]c匹配(这是MWE,实际上a,b,c代表更复杂的模式)。

我想通了:

不工作剪辑:

^(\[(a)?|(b)?\])?c$

匹配c,但 匹配[a]c[b]c

如果我移除外部可选组\[(a)?|(b)?\]c$,则它与[a]z[b]z匹配,但不可理解c

我可以通过以下方式解决这个问题:

工作片段

^(\[a\])|(\[b\])?c$

有人可以解释一下为什么最新版本有效且第一个不是吗?

3 个答案:

答案 0 :(得分:4)

您应该grouped ab替代方案:

^(\[(?:(a)|(b))\])?c$
    ^^^       ^

请参阅regex demo。如果您不这样做,则[仅在a之前匹配,而]仅在b之后匹配。您的正则表达式与[acb]c]c[c字符串匹配,请参阅your regex demo和图表:

enter image description here

请参阅下面的固定正则表达式详细信息:

  • ^ - 字符串的开头
  • ( - 第一个捕获组的开始:
    • \[ - 文字[
    • (?: - 非捕获组的开始:
      • (a) - 与a
      • 匹配的捕获组
      • | - 或
      • (b) - 与b
      • 匹配的捕获组
    • ) - 非捕获组的结束
  • \] - ]
  • )? - 第一个捕获组结束,?使其匹配1或0次
  • c - c
  • $ - 字符串结束。

固定的正则表达式图:

enter image description here

P.S。这些图表是在https://jex.im/regulex生成的。

答案 1 :(得分:0)

我想如果你想匹配c,[a] c或[b] c,那么你应该使用下面的表达式。

^((\[a\])?|(\[b\])?)?c$

答案 2 :(得分:-1)

您的第一个正则表现形式:

enter image description here

显然,它没有有效的路径来代表[a] c。