如何制作将多个模式匹配到同一索引的python正则表达式
Posted
技术标签:
【中文标题】如何制作将多个模式匹配到同一索引的python正则表达式【英文标题】:How to make python regex which matches multiple patterns to same index 【发布时间】:2011-08-31 08:16:15 【问题描述】:是否可以获得所有重叠匹配,它们从相同的索引开始,但来自不同的匹配组?
例如当我从“ABC”正则表达式中查找模式“(A)|(AB)”时,应该返回以下匹配项:
(0,"A") 和 (0,"AB")
【问题讨论】:
其实这个还是开放的,我不是很清楚我在找什么样的匹配。另一个例子是“AABAABA”我想要匹配 (0,['A']), (1,['A','AB']), (3, ['A']), (4 , ['A','AB']), (6, ['A']). 这个问答非常有用,因为它回答了两个问题,其中一个被误解但仍然有用。 【参考方案1】:虽然我不记得在哪里或从谁那里得到了这个
def myfindall(regex, seq):
resultlist = []
pos = 0
while True:
result = regex.search(seq, pos)
if result is None:
break
resultlist.append(seq[result.start():result.end()])
pos = result.start() + 1
return resultlist
它返回所有(甚至重叠)匹配的列表,每个索引的匹配限制不超过一个。
【讨论】:
在上面的情况下,这似乎只返回'A'但不匹配'AB'。 是的,没有独占部分的匹配打破了这一点。顺便说一句,***.com/questions/5616822/… 工作吗? 并非如此。我早些时候尝试过,它也没有按我的意愿工作。它只对匹配字符串的每个索引进行一次匹配。我最终编写了简单的基于查找表的解析器,因为这与正则表达式有关。 我没有意识到python有一个单独的search
函数并且match
只匹配字符串的开头:docs.python.org/2/library/re.html#search-vs-match【参考方案2】:
对于一种可能性,请参阅 Evpok 的答案。您的问题的第二种解释可能是您希望从同一位置同时匹配所有模式。在这种情况下,您可以使用前瞻表达式。例如。正则表达式
(?=(A))(?=(AB))
将为您提供所需的结果(即两种模式与组匹配的所有位置)。
更新:有了额外的说明,这仍然可以使用单个正则表达式来完成。您只需将上面的两个组都设为可选,即
(?=(A))?(?=(AB))?(?:(?:A)|(?:AB))
尽管如此,我不建议这样做。您可以更轻松地分别查找每个模式,然后再加入结果。
string = "AABAABA"
result = [(g.start(), g.group()) for g in re.compile('A').finditer(string)]
result += [(g.start(), g.group()) for g in re.compile('AB').finditer(string)]
【讨论】:
不错!这似乎正是我想要的。 我对问题添加了澄清评论。这个解决方案确实只给出了两种模式都匹配的匹配项。对于上面评论中的情况,它们将是 (1, ['A','AB']) 和 (4, ['A','AB'])。 对了,re.compile('AB').finditer(string)
真的有用吗? re.finditer('AD',string)
应该可以解决问题,或者如果您绝对想事先编译它,那么在列表理解之外执行它也应该起作用并澄清表达式。以上是关于如何制作将多个模式匹配到同一索引的python正则表达式的主要内容,如果未能解决你的问题,请参考以下文章