【问题标题】:Conditional Python regex and named group条件 Python 正则表达式和命名组
【发布时间】:2015-07-07 10:47:38
【问题描述】:

我有一个字符串:

/foo/bar

以及以下正则表达式:

/(?P<g1>.*)/(?P<g2>.*)$

通过模式匹配字符串并捕获两个组:

g1 = foo

g2 = 条形

如何强制进行可选匹配?

我需要将 "/bar" 捕获到 g1 = "bar" (但不是 /bar/)如果没有第二组可以匹配?

(用regex101测试它)

谢谢

【问题讨论】:

标签: python regex


【解决方案1】:

您需要一个字符串锚^ 的开头来将字符串限制为只有 2 个斜杠。正如 Avinash Raj 指出的那样,您需要将正则表达式的某些部分设为可选。

^/(?P<g1>[^/\n]*)/?(?P<g2>[^/\n]*)?(?<!/)$

demo

\n 仅在多行模式下是必需的,因此[^/] 无法匹配换行符。

正则表达式解释

  • ^/ - 字符串和文字的开头 /
  • (?P&lt;g1&gt;[^/\n]*) - 第一个强制捕获组(必须匹配 1 次)匹配除 / 以外的任何字符(或 \n,如果你保留它),0 次或更多次
  • /? - 0 或 1 / 字符
  • (?P&lt;g2&gt;[^/\n]*)? - 可选的第二个捕获组匹配除 /\n 之外的 0 个或多个字符
  • (?&lt;!/)$ - 以/ 以外的字符开头的字符串结尾。

【讨论】:

  • 这个正则表达式几乎是完美的,但是否可以通过传递附加条件来限制组。假设我需要匹配只允许三个字母的 g1?这样: /foo 和 /foo/barbar 匹配。但是 /fooo 和 /fooo/bar 没有。谢谢
  • 现在的问题是它也匹配 /foo/
  • 不应该,再看看我上面的评论。 \foo\ 未突出显示。
猜你喜欢
  • 1970-01-01
  • 2013-07-07
  • 2019-03-17
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多