2013-01-10 114 views
0

我已經得到了它具有以下格式的字符串正則表達式匹配問題

some_string =」 ,,, ,,, XXX XXX XXX ,,, ,,, ,,, XXX XXX XXX ,,,, ,,」 ,這是所謂的F

我想搜索XXX內的特定字詞文本文件的內容(假設這個詞是‘硅’)

注意,XXX都可以不同,可以包含除新行外的任何特殊字符(包括元字符)

match = re.findall(r",{3}(.*?silicon.*?),{3}", f.read()) 
print match 

但是,這似乎不起作用,因爲它返回格式爲: [「xxx ,,, xxx ,,, xxx ,,, xxx ,,, silicon」,「xxx ,,, xxx ,,, xxx ,,, xxsiliconxx「]但我只希望它返回[」硅「,」xxsiliconxx「]

我做錯了什麼?

回答

1

試試下面的正則表達式:

(?<=,{3})(?:(?!,{3}).)*?silicon.*?(?=,{3}) 

例子:

>>> s = ',,,xxx,,,silicon,,,xxx,,,xxsiliconxx,,,xxx' 
>>> re.findall(r'(?<=,{3})(?:(?!,{3}).)*?silicon.*?(?=,{3})', s) 
['silicon', 'xxsiliconxx'] 

我假設在xxx內容可以包含逗號,只要不是連續三個逗號或將結束領域。如果xxx部分內容不能包含任何逗號,你可以改用以下內容:

(?<=,{3})[^,\r\n]*?silicon.*?(?=,{3}) 

的原因,您目前的方法是行不通的,即使.*?將嘗試匹配儘可能少的字符越好,比賽仍然會盡早開始。因此,例如正則表達式a*?b將匹配整個字符串"aaaab"。唯一一次正則表達式將提前的起始位置是當正則表達式不匹配時,並且因爲,,,可以匹配.*?,所以您的匹配將始終從字符串的開頭或之前的匹配開始。

的回顧後和前瞻用於應對JaredC在意見中提出的問題,基本上re.findall()不會返回重疊的匹配,所以你需要在開頭和結尾,,,到不是比賽的一部分。

+0

請注意,這不適用於字符串',,, xxx ,,,硅,,,, xxsiliconxx ,,, xxx'我不認爲,但這可能是OP解決的另一個問題。 – JaredC

+0

@JaredC好點,增加了lookbehead/lookahead來解決這個問題。 –

+0

非常感謝!看起來工作 – Crust3