如何解决正则表达式可选组不匹配
我有这样的字符串:/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
解决方法
你可能会使用
^/([^/]+)/([^/]+?((?<=_)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','')]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。