如何制作将多个模式匹配到同一索引的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正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中匹配具有多个正则表达式模式的字符串

Java的正则表达式

Python 正则表达式 - 了解匹配和搜索之间的区别

python基础——正则表达式

python正则表达式

Python3 正则表达式