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)?)+)