我有这样的字符串:/A/B
其中 A
和 B
可以包含任意字符,/
除外。有时在 _X
中有一个字符串 B
后跟一个数字。我想用数字捕获 A
、B
和 X
。
我有这个正则表达式:^/(.+)/(.+?(?:_(X\d))?.+?)$
但它只捕获 A
和 B
,在使用 X
时从不捕获 re.match(regex, string)
。
更新: 示例字符串可以是:
/l/_ _X3test
-> 应该产生组 l
, _ _X3test
, X3
/l/_ X3test
-> 应该产生组 l
, _ X3test
, None
/l/_ _Xtest
-> 应该产生组 l
, _ _Xtest
, None
答案 0 :(得分:1)
你可能会使用
^/([^/]+)/([^/]+?((?<=_)X\d|$).*)
模式匹配
^
字符串开头/([^/]+)
匹配 /
,开始捕获 group 1 并匹配除 /
/([^/]+?
匹配 /
并开始捕获 group 2 尽可能匹配除 /
之外的任何字符
(
捕获第 3 组 (嵌套在第 2 组中)
(?<=_)X\d
正向后视断言 _ 直接向左,然后匹配 X
和一个数字|
或$
断言字符串的结尾)
关闭第 3 组.*
匹配任意字符的 0 次以上(该行的其余部分))
关闭第 2 组例如
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', '')]