首页 > 解决方案 > 正则表达式 - 在任何 m 字母窗口中匹配 n 次出现的子字符串

问题描述

我正面临一些问题,形成一个正则表达式,该正则表达式在输入字符串的 m 个字符内匹配给定模式的至少 n 次。例如假设我的输入字符串是:

00000001100000001110111100000000000000000000000000000000000000000000000000110000000111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100

我想检测输入字符串中 1 至少出现 7 次(不一定连续)但在最多 20 个字符的窗口内的所有情况。

到目前为止,我已经构建了这个表达式:

(1[^1]*?){7,}

它检测输入字符串中 1 至少出现 7 次的所有情况,但这现在与以下两种情况都匹配:

11000000011101111

1100000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011

部分,而我只希望保留第一个,因为它位于由少于 20 个字符组成的子字符串中。

它试图将上述正则表达式与:

(?=(^[01]{0,20}))

也只匹配包含长度不超过 20 个字符的“1”或“0”的字符串的一部分,但是当我这样做时它停止工作。

有没有人有一个想法来完成这个?我已将此示例放在regex101中作为快速参考。

非常感谢!

标签: regex

解决方案


如果不列出所有可能的字符串,这不是可以用正则表达式完成的。您将需要迭代字符串。

您还可以遍历匹配项。Python 中的示例:

import re
matches = re.finditer(r'(?=((1[^1]*?){7}))', string)
matches = [match.group(1) for match in matches if len(match.group(1)) <= 20]

推荐阅读