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

时间:2017-02-06 21:47:35

标签: 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)
    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

然而,这就是我所得到的:

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

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

1 个答案:

答案 0 :(得分:0)

问题根本不是字符串格式化;它只是没有帮助你的模式的可读性。

问题在于量词。您拥有的完整模式是:

  

(?P(Sum为(?P [0-9] +)\ s *(?P(范围模式为(?P(正常))\ s *面积为(?P [0-9] ] +))+)?)+)

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

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

当你的模式匹配时,整个&#34;范围&#34;部分是可选的,整个事情可以重复。所以在你的第一组输入中它匹配&#34; Sum ... 60&#34; part,匹配换行符,然后重复&#34; Sum ... 30 \ nrange ...&#34;一部分。

也许你不想在你的小组中重复一次或多次?改变这使你的例子适合我。 (请注意,第一个匹配在结尾处将包含换行符;您可能希望在打印之前将其删除)