第二个可选捕获组取决于regex中的可选分隔符

lfapxunr  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(128)

很抱歉问了这个可能重复的问题。我检查了有关 * 可选捕获组 * 的现有问题和答案。我尝试了一些方法,但无法将答案转换为我自己的示例。
这是两条输入线

id:target][label
id:target

我想捕获id:(组1)、target(组2),如果存在][,则捕获label(组3)。
使用的正则表达式(Python regex)只在第一行(live example on regex101)起作用。

^(.+:)(.*)\]\[(.*)

在其他的例子中,我不明白正则表达式是如何使捕获组可选的,也许我使用的分隔符][也与我的理解问题混淆了。
我试过的一件事是

^(.+:)(.*)(\]\[(.*))?

这不符合预期

watbbzwu

watbbzwu1#

你可以在结尾使用一个锚点,在第1组使用一个取反的字符类,在第2组使用一个非贪婪的量词,然后选择匹配第3部分:

^([^:]+:)(.*?)(?:]\[(.*))?$
    • 说明**
  • ^字符串开始
  • ([^:]+:)组1,匹配除:以外的1+个字符,然后使用求反字符类匹配:
  • (.*?)组2,匹配任何字符,尽可能少
  • (?:非捕获组,以作为整个部件进行匹配
  • ]\[匹配][
  • (.*)组3,匹配任意字符
  • )?关闭非捕获组并将其设为可选
  • $字符串结束

参见regex101 demo
如果您只匹配例如单词字符,则可以考虑:

^([^:]+:)(\w+)(?:]\[(\w+))?

查看另一个regex101 demo

相关问题