这让我疯了。
我试图找到" 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"]
非常感谢任何帮助!
谢谢!
答案 0 :(得分: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个字符的前缀,然后从那里获取它。
在更一般的情况下,例如lead标签应该是DOD而不是DOI,你不能使用re.finditer():
Input text: DODOD987654321
First match: DODOD987654321
Second match: DOD987654321 # Not found by re.finditer()
在最常见的情况下(例如,主要标签是DDD),您需要在循环中执行re.search(),在成功匹配后仅将搜索开始位置增加1位。