使用正则表达式检查连续重复的确切次数

Check for exact number of consecutive repetitions with a regex

仅使用正则表达式,如何匹配任意单个标记的准确连续重复次数?例如,匹配“ttaaabbb”中的“aaa”而不是“ttaaaabbb”中的“aaaa”,假设所需的重复次数为 3.

澄清:注意我使用“a”作为示例,标记可以是任意的character/number/symbols。也就是说,给定所需的重复次数为 3,“aaaa**!!!cccc333**”的所需匹配项仅给出“!!!”和“333”。

简而言之,我想找到给定字符串中出现YXXXY的标记“X”的列表(Y是一些不同于X的其他标记,Y也可以是字符串的开头或结尾的字符串)。请注意,列表中可以有重复的标记,例如,“aaabbbbaaa”应该给出 ["a", "a"].

其他一些示例:

输入:“aaabbbbbbaaa****ccc”,输出:[“a”,“a”,“ C”] 输入:“!!! aaaabbbaaa ccc!!!”,输出:[“!” , "b", "a", "c", "!".

我试过的:我试过(.){2}但不幸的是,它在上面的例子中也匹配“aaaa”和“ccccc”。我进一步将其更改为 (?!)(.){2}(?!) 以便重复模式的前缀和后缀与其不同。但是,在这种情况下我得到了一个错误,因为第一个 在被引用时是未定义的。

您可以使用正则表达式和循环执行类似的操作:

def exact_re_match(string, length):
    regex = re.compile(r'(.)*')
    for match in regex.finditer(string):
        elm = match.group()
        if len(elm) == length:
            yield elm

string = "aaaa!!!cccc333"
out = list(exact_re_match(string, 3))
print(out)
# ['!!!', '333']

您可以使用包含 2 个捕获组和重复反向引用的模式。

首先匹配 4 次或更多次您要避免的相同重复字符,然后匹配 3 次相同字符。

您想要的单个字符在捕获组 2 中,例如您可以使用 re.finditer 获取。

(\S){3,}|(\S){2}

模式匹配:

  • (\S){3,} 捕获组 1,匹配非空白字符并重复反向引用 3 次或更多次
  • |
  • (\S){2} 捕获组 2,匹配一个非空白字符并重复反向引用 2 次

Regex demo | Python demo

例如:

import re

strings = [
    "aaaa**!!!cccc333**",
    "aaabbbbaaa",
    "aaabbbbbbaaa****ccc",
    "!!! aaaabbbaaa ccc!!!"
]
pattern = r"(\S){3,}|(\S){2}"
for s in strings:
    matches = re.finditer(pattern, s)
    result = []
    for matchNum, match in enumerate(matches, start=1):
        if match.group(2):
            result.append(match.group(2))
    print(result)

输出

['!', '3']
['a', 'a']
['a', 'a', 'c']
['!', 'b', 'a', 'c', '!']