Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式Python-查找每个关键字实例,提取关键字和继续字符_Python_Regex - Fatal编程技术网

正则表达式Python-查找每个关键字实例,提取关键字和继续字符

正则表达式Python-查找每个关键字实例,提取关键字和继续字符,python,regex,Python,Regex,这快把我逼疯了 我试图在一系列文档中找到“DOI”的每一个实例或它被错误扫描的等价物。然后我想收集术语“DOI”和最多15个字母数字字符,这些字符应该在后面。但我也需要确保我找到了这些,即使它们与之前的比赛重叠 我试图推断出以前的解决方案,我被赋予了另一个类似的问题,但没有成功 下面是我用来测试这个的例子 要搜索的字符串: "abhgfigDOI567afkgD0Idhdhfhfhdbvbkab3343432q3DO1fbaguig7ggkgafgkgDOIDOID01OO1" DOI|DO

这快把我逼疯了

我试图在一系列文档中找到“DOI”的每一个实例或它被错误扫描的等价物。然后我想收集术语“DOI”和最多15个字母数字字符,这些字符应该在后面。但我也需要确保我找到了这些,即使它们与之前的比赛重叠

我试图推断出以前的解决方案,我被赋予了另一个类似的问题,但没有成功

下面是我用来测试这个的例子

要搜索的字符串:

"abhgfigDOI567afkgD0Idhdhfhfhdbvbkab3343432q3DO1fbaguig7ggkgafgkgDOIDOID01OO1"
DOI|DO1|D01|D0I|001|00I|0O1|0OI|O01|O0I|OO1|OOI
["DOI567afkgD0Idhdhf",
"D0Idhdhfhfhdbvbkab",
"DO1fbaguig7ggkgafg",
"DOIDOID01OO1",
"DOID01OO1",
"D01OO1",
"001"]
DOI变体:

"abhgfigDOI567afkgD0Idhdhfhfhdbvbkab3343432q3DO1fbaguig7ggkgafgkgDOIDOID01OO1"
DOI|DO1|D01|D0I|001|00I|0O1|0OI|O01|O0I|OO1|OOI
["DOI567afkgD0Idhdhf",
"D0Idhdhfhfhdbvbkab",
"DO1fbaguig7ggkgafg",
"DOIDOID01OO1",
"DOID01OO1",
"D01OO1",
"001"]
预期结果:

"abhgfigDOI567afkgD0Idhdhfhfhdbvbkab3343432q3DO1fbaguig7ggkgafgkgDOIDOID01OO1"
DOI|DO1|D01|D0I|001|00I|0O1|0OI|O01|O0I|OO1|OOI
["DOI567afkgD0Idhdhf",
"D0Idhdhfhfhdbvbkab",
"DO1fbaguig7ggkgafg",
"DOIDOID01OO1",
"DOID01OO1",
"D01OO1",
"001"]
任何帮助都将不胜感激

谢谢

以那种形式使用“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():

在最常见的情况下(例如,lead标记是DDD),您需要在循环中执行re.search(),在成功匹配后仅将搜索开始位置增加1位