2011-05-30 158 views
1

這讓我瘋狂。正則表達式Python - 查找每個關鍵字實例,提取關鍵字並繼續處理字符

我試圖找到「DOI」的每個實例,或者它在一系列文檔中是錯誤掃描的等價物。然後我想收集術語「DOI」以及最多15個字母數字字符。但我也需要確保我找到這些,即使它們與前一場比賽重疊。

我試圖推斷這個以前的解決方案,我給了另一個類似的問題,但沒有成功。

Python regex find all overlapping matches?

這裏是我使用來測試這個例子。

要搜索的字符串:

"abhgfigDOI567afkgD0Idhdhfhfhdbvbkab3343432q3DO1fbaguig7ggkgafgkgDOIDOID01OO1" 

DOI變化:

DOI|DO1|D01|D0I|001|00I|0O1|0OI|O01|O0I|OO1|OOI 

預期結果:

["DOI567afkgD0Idhdhf", 
"D0Idhdhfhfhdbvbkab", 
"DO1fbaguig7ggkgafg", 
"DOIDOID01OO1", 
"DOID01OO1", 
"D01OO1", 
"001"] 

任何援助將不勝感激!

謝謝!

回答

2

使用「DOI變體」DOI | DO1 | D01 | D0I | 001 | 00I | 0O1 | 0OI | O01 | O0I | OO1 | OOI從字面上看並不是一個好主意。從基礎開始:D + 0 + O,O + 0和I + 1。這立即導致了模式「[D0O] [O0] [I1]」,它更加緊湊,不易出錯,並且能夠更快地執行(如果你想進入Cython或C)。

然後,您可以在本案例中使用re.finditer()來查找匹配的3個字符的前綴,然後從中取出。

在更一般的情況下,例如,鉛標籤應美國國防部,而不是DOI,您不能使用re.finditer():

Input text:  DODOD987654321 
First match: DODOD987654321 
Second match:  DOD987654321 # Not found by re.finditer() 

在最一般的情況下(如鉛標籤DDD),你需要做的re.search()在循環中,成功匹配後,搜索起始位置僅增加1個位置。