我正在尝试匹配python中的rc-update -s
输出。
m = re.match(r"^\s*(\w+)\s*\|{\s*(\w+)\s*}*$", " network | level1 level2 leveln ")
但m
始终为None
感谢。
答案 0 :(得分:1)
{}
在这里很奇怪,使用这种方式时它们不是元字符,有什么用途,因为目前他们试图匹配文字{
并且匹配失败。
用普通的括号替换它们,它会起作用
答案 1 :(得分:1)
大括号(“{}”)没有按照你的想法去做,至少在这个例子中是这样。
您似乎想要一个不匹配的群组。使用Python的re
,其语法为(?:\s*(\w+)\s*)
,以匹配您的示例。
通过对您的示例进行此更改,我得到:
>>> m = re.match(r"^\s*(\w+)\s*\|(?:\s*(\w+)\s*)*$", " network | level1 level2 leveln ")
>>> m
<_sre.SRE_Match object at 0x00F217B8>
>>> m.groups()
('network', 'leveln')
请注意,结果仅包含重复组的最后一个匹配项。如果要获取所有匹配项,请匹配包含重复项的整个表达式,然后解析该匹配项以查找每个匹配项。例如:
>>> m = re.match(r"^\s*(\w+)\s*\|((?:\s*\w+\s*)*)$", " network | level1 level2 leveln ")
>>> m.groups()
('network', ' level1 level2 leveln ')
>>> m.groups()[1].strip().split()
['level1', 'level2', 'leveln']
另外,在没有正则表达式的情况下,这看起来更简单。正如您所看到的,正则表达式有很多陷阱并且很快就会变得混乱。