我似乎无法让正则表达式与以下示例一起使用。基本上我想从一个字符串中解析 4 个组,如下所示:test.thistest[extra].thistest[extra].this{data}test.this{data}我想分别针对上面的示例得到这样的答案:val1='test', val2=None, val3='this', val4=Noneval1='test', val2='extra', val3='this', val4=Noneval1='test', val2='extra', val3='this', val4='data'val1='test', val2=None, val3='this', val4='data'我尝试了这个,但它不起作用:import retests = ["test.this", "test[extra].this", "test[extra].this{data}", "test.this{data}",]for test in tests: m = re.match(r'^([^\[\.]+)(?:\[([^\]]+)])(?:\.([^{]+){)([^}]+)?$', test) if m: print(test, '->', m[1], m[2], m[3], m[4])
2 回答
![?](http://img1.sycdn.imooc.com/545868190001d52602200220-100-100.jpg)
慕桂英4014372
TA贡献1871条经验 获得超13个赞
如果只有第二组和第四组是可选的,您可以使用:
^([^\[\.]+)(?:\[([^\]]+)])?\.([^{\r\n]+)(?:{([^}\r\n]+)})?$
演示。
请注意,\r
和\n
被添加到第三组和第四组的否定字符类中,以避免超出行尾。如果您只使用单行字符串,则没有必要。
![?](http://img1.sycdn.imooc.com/5458683f00017bab02200220-100-100.jpg)
慕少森
TA贡献2019条经验 获得超9个赞
import re
tests = ["test.this",
"test[extra].this",
"test[extra].this{data}",
"test.this{data}"]
pat = re.compile(r'(\w+)([\[])?(\w+)?([\]])?\.(\w+){?(\w+)?')
for test in tests:
x = pat.search(test)
print(x.group(1),x.group(3),x.group(5),x.group(6))
(\w+) -> 捕获测试
([\[])? -> 捕获[
(\w+)? -> 捕获额外的
([\]])? -> 捕获]
(\w+) -> 捕获此内容
(\w+)? -> 捕获数据
添加回答
举报
0/150
提交
取消