当前位置: 首页 > 面试题库 >

正则表达式包括具有相同开始的重叠匹配

长孙永思
2023-03-14
问题内容

我正在使用Python 3.6。

我的目标是匹配一个正则表达式,该正则表达式可以匹配多个字符串,这些字符串重叠和/或从同一位置开始,例如:

re.findall('B.*A','BADACBA')

这使:

['BADACBA']

但是我想要:

['BADACBA','BADA','BA','BA']

(第二个'BA'是因为'BA'字符串中有两个实例)

关于如何使用正则表达式查找重叠匹配项的建议?,我已尝试将其装在前行中:

re.findall('(?=(B.*A))','BADACBA')

这使:

['BADACBA', 'BA']

更好,但仍然不是我想要的。

我还尝试了该regex模块:

regex.findall('B.*A','BADACBA',overlapped=True)

但它仍然返回:

['BADACBA', 'BA']

我还没有找到可以找到所有匹配项的东西。因为我有很多这样的正则表达式,所以硬编码的解决方案将无济于事。是否有执行此操作的模块/功能

谢谢!


问题答案:

如前所述,正则表达式主要是一种线性和仅单规则的引擎-
您可以在是否贪婪捕获之间进行选择,但不能同时选择两者。而且,大多数正则表达式引擎不支持重叠匹配(甚至那些支持它的子字符串/强制头部移动来伪造它),因为它也不符合正则表达式的原理。

如果只寻找两个子字符串之间的简单重叠匹配,则可以自己实现:

def find_substrings(data, start, end):
    result = []
    s_len = len(start)  # a shortcut for `start` length
    e_len = len(end)  # a shortcut for `end` length
    current_pos = data.find(start)  # find the first occurrence of `start`
    while current_pos != -1:  # loop while we can find `start` in our data
        # find the first occurrence of `end` after the current occurrence of `start`
        end_pos = data.find(end, current_pos + s_len)
        while end_pos != -1:  # loop while we can find `end` after the current `start`
            end_pos += e_len  # just so we include the selected substring
            result.append(data[current_pos:end_pos])  # add the current substring
            end_pos = data.find(end, end_pos)  # find the next `end` after the curr. `start`
        current_pos = data.find(start, current_pos + s_len)  # find the next `start`
    return result

这将产生:

substrings = find_substrings("BADACBA", "B", "A")
# ['BA', 'BADA', 'BADACBA', 'BA']

但是您必须对其进行修改才能进行更复杂的匹配。



 类似资料:
  • 问题内容: 我试图创建下面的正则表达式:返回之间的字符串和(或或)从下列字符串RNA: ,让所有的比赛会被发现,包括重叠的。 我尝试了几种正则表达式,最后得到了类似的结果: 您能告诉我我的正则表达式模式中的错误吗? 问题答案: 用一个正则表达式执行此操作实际上是非常困难的,因为大多数用法 都不 希望重叠匹配。但是,您可以通过一些简单的迭代来做到这一点: 虽然,这有一些问题。您希望得到的回报是什么?

  • 问题内容: 在下面的代码中: 结果是: 我希望成为 如何实现? 问题答案: 使匹配器尝试从后者开始下一个扫描。

  • 有没有API方法可以返回与正则表达式匹配的所有子字符串(可能重叠)? 例如,我有一个文本字符串:

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 问题内容: 我正在尝试在Python 2.6中使用re查找更大系列的数字中的每10位数字系列。 我很容易就能抓住不重叠的比赛,但我希望数字系列中的每场比赛。例如。 在中 我应该得到以下列表: 我已经找到了“超前”的引用,但是我所看到的示例仅显示数字对,而不是较大的分组,而且我无法将其转换为两位数以外的数字。 问题答案: 在前瞻范围内使用捕获组。前瞻捕捉你感兴趣的文本,但是实际匹配在技术上是前瞻之前

  • 问题内容: 正则表达式可以匹配空格 或 字符串的开头吗? 我正在尝试用英镑符号替换缩写为GBP的货币。我可以匹配任何以GBP开头的东西,但我想更加保守一些,并在它周围寻找某些定界符。 我可以同时做后两个例子吗? 问题答案: 使用OR“ ”运算符: