Python 2.7 带格式字符串的Python正则表达式子模式

Python 2.7 带格式字符串的Python正则表达式子模式,python-2.7,Python 2.7,我有一个简单的输出: def main(): output = ['Sum is 60', \ 'Sum is 30','range pattern is normal', 'area is 3', \ 'Sum is 20', 'range pattern is stub', 'area is 1' \ 'Sum is 50'] cmdOut = '\n'.join(output) r

我有一个简单的输出:

def main(): 
    output = ['Sum is 60', \
              'Sum is 30','range pattern is normal', 'area is 3', \
              'Sum is 20', 'range pattern is stub', 'area is 1' \
              'Sum is 50']
    cmdOut = '\n'.join(output)
    rangePattern = "range pattern is (?P<rP>(normal|stub))\s*" \
                   "area is (?P<id>[0-9]+)"
    areaPattern = "Sum is (?P<num>[0-9]+)\s*" \
           "(?P<range>(%s)+)?" % (rangePattern)
    patt = "(?P<area>(%s)+)" % (areaPattern)
    for m in re.finditer( patt, cmdOut ):
      print m.group( 'area' )
      print '-'
然而,我得到的是:

Sum is 60
Sum is 30
range pattern is normal
-
Sum is 20
range pattern is stub
-
Sum is 50

我想知道为什么它没有分离第一组和第二组,尽管它成功地分离了第三组和第四组。

问题根本不是字符串格式;这对模式的可读性没有帮助

问题是你的量词。您拥有的完整模式如下:

(?p(总和为(?p[0-9]+)\s*(?p(范围模式为(?p(正常存根))\s*面积为(?p[0-9]+)+))+)

如果我为了清晰而重写它(不是为了实际的功能),它将如下所示:

(?P<area>(sum\s(range)?)+)
(?P(总和\s(范围)?)+)
当模式匹配时,整个“范围”部分是可选的,并且可以重复整个过程。因此,在您的第一组输入中,它匹配“Sum…60”部分,匹配换行符,然后重复“Sum…30\n范围…”部分

也许你不想在小组中重复一次或多次?改变这一点让你的例子对我有用。(请注意,第一个匹配项的末尾将包含一个换行符;您可能希望在打印它之前删除该换行符)

(?P<area>(sum\s(range)?)+)