2014-01-16 38 views
0

我讀的格式如下抓住支架和裏面的一切正則表達式

.... .... [..*stuff*..].... ... .... .... [*stuff*] ... ... [*stuff*] 

凡點...*stuff*只是數字和文字

我想只提取一審線括號內的文字/號碼以及支架本身

所以...的

[..*stuff*..]

目前,我的代碼執行此操作,但有時如果有多組括號,它會提取第一組括號後面的所有內容。

這意味着,當我想第一組括號裏面的一切也將打印出字符串

[*stuff*]...........[*sutff*].....[*stuff*]

的剩餘部分時,我只是想在第一組括號和裏面的一切。

我正在使用的正則表達式是BracketedRegex = re.compile(r'\[.*\]')

我的代碼:

BracketedRegex = re.compile(r'\[.*\]') 

f = open("logfile.log","r") 

for line in f.readlines(): 
    Bracket = re.search(BracketedRegex,line) 
    if Bracket: 
     print Bracket.group() 

回答

5

你需要讓你的正則表達式非貪婪:

BracketedRegex = re.compile(r'\[.*?\]') 

*?量詞將至少數量滿足模式字符的匹配,而不是到*這將匹配最大號碼。

或者,也可以匹配任何不是右括號(代替.元字符):

BracketedRegex = re.compile(r'\[[^\]]*\]') 

其中[^..]負字符類不是一個類的成員,例如匹配任何任何東西不是 a ]字符。

+0

這個伎倆!非常感謝!非常感激!! – Liondancer

+0

似乎有人認爲非貪婪的正則表達式總是錯誤的解決方案,不管怎樣,儘管我從來不明白他們爲什麼這麼想......這就是使用它們的範例。 – abarnert

+0

@abarnert:除了另一個最近的''[regex]'我的答案也被低估了,一個沒有使用'*'和'*?''的。也許有人不喜歡我回答正則表達式的問題。 –

相關問題