Skip to main content
 首页 » 编程设计

python之正则表达式:可选不工作

2024年08月19日40cmt

我是正则表达式的新手。我找到了解决以下问题的方法,但我想知道为什么我的第一个代码段不起作用:

假设我想匹配 (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$

谁能解释一下为什么这个最新的有效而第一个无效?

请您参考如下方法:

你应该有 grouped a 和 b 选项:

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

参见 regex demo .如果不这样做,[只匹配a之前,]只匹配b之后.并且您的正则表达式匹配 [ac、b]c、]c、[c 字符串,请参阅 your regex demo和图表:

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

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

一个固定的正则表达式图:

附言这些图表生成于 https://jex.im/regulex .