2013-12-20 41 views
2

我想使用Python正則表達式分別從一字符串(如下所示)抓住L1和L2的內容:Python的正則表達式匹配太多字符串的

import re 

S = """ 
L1 = { 
    {1, 3, 4, 5, 6}, 
    {1, 3, 4, 5, 6}, 
    {1, 3, 4, 5, 6} 
}; 

L2 = { 
    {1, 3, 4, 5, 6}, 
    {1, 3, 4, 5, 6}, 
    {1, 3, 4, 5, 6} 
}; 
""" 

pattern = "L[12] = \{(.*)\}\;" 

print re.findall(pattern, S, flags=re.DOTALL) 

然而,這種圖案會產生以下匹配:

['\n {1, 3, 4, 5, 6},\n {1, 3, 4, 5, 6},\n {1, 3, 4, 5, 6}\n};\n\nL2 = {\n {1, 3, 4, 5, 6},\n {1, 3, 4, 5, 6},\n {1, 3, 4, 5, 6}\n}'] 

我本來會期望匹配終止在分號來產生兩個單獨的匹配,但相反,它抓住了一切。

+0

分號不需要轉義(大括號似乎不太)。 –

回答

6

試着改變你的模式

pattern = "L[12] = \{(.*?)\}\;" 

?將使*非貪婪和匹配的文本可能的最小量。

+0

我只是剪切和粘貼他現有的正則表達式。 –

3

這是因爲在Python(和許多其他語言)中,正則表達式*限定符是貪婪。從Python docs

*+,並且?預選賽都是貪婪的;它們儘可能地匹配文本。有時候這種行爲是不希望的;如果RE <.*><H1>title</H1>匹配,則它將匹配整個 字符串,而不僅僅是<H1>。限定符後添加?使其 以非貪婪或最小方式執行匹配;儘可能少的字符 將被匹配。在前面的表達式中使用.*?將 僅匹配<H1>

至於建議,只需要添加額外的?預選賽到您的模式:

pattern = "L[12] = \{(.*?)\}\;" 
0

放在括號()之間YOUT模式:

pattern = "(L[12] = \{.*?\}\;)" 

爲@CoreyOgburd甾體抗炎藥不要忘記?字符。