正则表达式帮助使用重复的组

时间:2010-06-01 21:09:11

标签: python regex

我正在尝试匹配python中的rc-update -s输出。

m = re.match(r"^\s*(\w+)\s*\|{\s*(\w+)\s*}*$", " network | level1 level2 leveln ")

m始终为None

对我来说,困难的部分是让正则表达式匹配n级。我认为使用{} *会匹配n个级别,但只要我添加{}没有匹配。

感谢。

2 个答案:

答案 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']

另外,在没有正则表达式的情况下,这看起来更简单。正如您所看到的,正则表达式有很多陷阱并且很快就会变得混乱。