正则表达式可选组不匹配

时间:2021-03-19 13:30:03

标签: python regex

我有这样的字符串:/A/B 其中 AB 可以包含任意字符,/ 除外。有时在 _X 中有一个字符串 B 后跟一个数字。我想用数字捕获 ABX

我有这个正则表达式:^/(.+)/(.+?(?:_(X\d))?.+?)$

但它只捕获 AB,在使用 X 时从不捕获 re.match(regex, string)

更新: 示例字符串可以是:

  • /l/_ _X3test -> 应该产生组 l, _ _X3test, X3
  • /l/_ X3test -> 应该产生组 l, _ X3test, None
  • /l/_ _Xtest -> 应该产生组 l, _ _Xtest, None

1 个答案:

答案 0 :(得分:1)

你可能会使用

^/([^/]+)/([^/]+?((?<=_)X\d|$).*)

模式匹配

  • ^ 字符串开头
  • /([^/]+) 匹配 /,开始捕获 group 1 并匹配除 /
  • 之外的任何字符
  • /([^/]+? 匹配 / 并开始捕获 group 2 尽可能匹配除 / 之外的任何字符
    • ( 捕获第 3 组 (嵌套在第 2 组中)
      • (?<=_)X\d 正向后视断言 _ 直接向左,然后匹配 X 和一个数字
      • |
      • $ 断言字符串的结尾
    • ) 关闭第 3 组
    • .* 匹配任意字符的 0 次以上(该行的其余部分)
  • ) 关闭第 2 组

Regex demo

例如

import re

pattern = r"^/([^/]+)/([^/]+?((?<=_)X\d|$).*)"
strings = [
    "/l/_ _X3test",
    "/l/_ X3test",
    "/l/_ _Xtest"
]

for s in strings:
    print(re.findall(pattern, s))

输出

[('l', '_ _X3test', 'X3')]
[('l', '_ X3test', '')]
[('l', '_ _Xtest', '')]