2011-05-30 162 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个位置。