我有一个简单的输出:
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组。
答案 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;一部分。
也许你不想在你的小组中重复一次或多次?改变这使你的例子适合我。 (请注意,第一个匹配在结尾处将包含换行符;您可能希望在打印之前将其删除)