我知道有不同的方法可以做到这一点,但我只想知道为什么我的正则表达式不起作用。这实际上并不是我需要做的事情,我只是想看看是否可以使用正则表达式来做到这一点,而且我不知道为什么我的代码不起作用。
给定一个字符串 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
没有 a
或b
第一个 b
之间和第一个c
第一个之后b
,使用的正确正则表达式是:
r'a[^ab]*b[^abc]*c'
您当前使用的正则表达式将尽一切努力在字符串上成功,包括匹配文字 b
到 b
第一个之后b
,这就是为什么"abbc"
已匹配。仅通过明确排除 b
在第一个字符类中可以避免这种情况并且 b
只匹配第一个 b
a
之后.
关于python - 尝试查找包含特定子序列的不重叠子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612822/