2017-02-06 85 views
0

表達子圖案我有一個簡單的輸出:Python正與格式字符串

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 

我不知道爲什麼,雖然它成功地分離了第三和第四不分開第一和第二組。

回答

0

問題不在於字符串格式化;它只是無助於你的模式的可讀性。

問題是你的量詞。您所擁有的完整模式是:

(?P(Sum)是(?P [0-9] +)\ s *(?P(範圍模式是(?P(正常) S *面積)+))+)

如果我把它改寫爲清楚起見(沒有實際的功能),它看起來像這樣(P [0-9] +?):

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

當你的模式匹配時,整個「範圍」部分是可選的,整個事情可以重複。因此,在第一組輸入中,它匹配「Sum ... 60」部分,匹配換行符,然後用「Sum ... 30 \ nrange ...」部分重複。

也許你不想在你的小組中重複一次或多次?改變這一點讓你的例子對我有用。 (請注意,第一場比賽將在最後包含一個換行符;您可能需要在打印之前將其刪除)