代码之家  ›  专栏  ›  技术社区  ›  Chris H

使用重新创建的组的regex帮助

  •  0
  • Chris H  · 技术社区  · 14 年前

    我在努力匹配 rc-update -s 用python输出。

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

    但是 m 总是 None

    对我来说最困难的部分是让regex匹配n级。我认为使用*可以匹配n级,但只要添加无匹配项。

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   taleinat    14 年前

    花括号(“”)不执行您认为它们执行的操作,至少在本例中是这样。

    您似乎想要一个不匹配的组。用蟒蛇的 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']
    

    另一方面,如果没有regexps,解析起来会简单得多。正如您所看到的,regexp有很多gotchas,并且很快就会变得混乱。

        2
  •  1
  •   Paul Creasey    14 年前

    这个 {} 这里很奇怪,用这种方式使用时它们不是元字符,有什么目的,因为目前它们正试图匹配一个文本 { 比赛失败了。

    用普通圆括号替换它们,它就可以工作了