python - 尝试查找包含特定子序列的不重叠子字符串

标签 python regex

我知道有不同的方法可以做到这一点,但我只想知道为什么我的正则表达式不起作用。这实际上并不是我需要做的事情,我只是想看看是否可以使用正则表达式来做到这一点,而且我不知道为什么我的代码不起作用。

给定一个字符串 S,我想找到包含遵守某些规则的子序列 Q 的所有非重叠子字符串。现在,假设我正在搜索子序列 "abc"。我想匹配 S 的一个子字符串,其中包含 'a',后跟 'b',后跟 'c'限制是 'a' 后面不能有 'a',并且不能有 'a''b'跟随'b'。我使用的正则表达式如下(在Python中):

regex = re.compile(r'a[^a]*?b[^ab]*?c')
match = re.finditer(regex, string)

for m in match:
    print m.group(0)

对我来说,这可以分解如下:

a[^a]*?b:'a' 后跟不包括 'a' 的最小字符数,并以a 'b'
[^ab]*?c:不包括 'a''b' 并以 结尾的最小字符数'c'

因此,将所有这些放在一起,我假设我会匹配 S 的非重叠子字符串,其中包含遵守我的排除规则的子序列“abc”。

工作正常,例如:

S = "aqwertybwertcaabcc",它给出了 "aqwertybwertc""abc"

但它无法适用于S = "abbc",因为它与"abbc"匹配。

最佳答案

假设您真正想要的是子序列 Q 不包含 a第一个 a 之间和第一个b没有 ab第一个 b 之间和第一个c第一个之后b ,使用的正确正则表达式是:

r'a[^ab]*b[^abc]*c'

您当前使用的正则表达式将尽一切努力在字符串上成功,包括匹配文字 bb第一个之后b ,这就是为什么"abbc"已匹配。仅通过明确排除 b在第一个字符类中可以避免这种情况并且 b只匹配第一个 b a之后.

关于python - 尝试查找包含特定子序列的不重叠子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612822/

相关文章:

python - 如何在使用 AWS Lambda 中的 POST 方法和正文执行 307 重定向时传递请求正文?

Python 3.6 windows 无法使用从 pip 安装的包

regex - 是否存在可以确定一种常规语言是否匹配任何输入,另一种常规语言匹配的算法?

PHP 将所有点替换为逗号

regex - 使用基于 sed/awk 的 linux 替换字符串

python - 如何在其构造函数中使用额外参数正确初始化 dict 的子类?

python - 根据条件更改 tensorflow 张量的值

仅在未找到重复行时才匹配的正则表达式

python - 如何在 Python 2.7.2 中计算一组 GPS 卫星的 DOP 值?

regex - 正则表达式搜索避免嵌套结果