Dev*_*rre 12
使用负向前瞻和负面后瞻.
这将是正则表达式:(.)(?<!\1.)\1{N-1}(?!\1)除了Python的re模块被破坏(参见此链接).
英语翻译:"匹配任何一个字符.确保在匹配该字符后,前面的字符也不是那个字符.匹配N-1个字符的重复次数.确保重复之后的字符不是那个字符."
不幸的是,re模块(和大多数正则表达式引擎)都被破坏了,因为你不能在lookbehind断言中使用反向引用.Lookbehind断言需要是恒定长度,并且编译器不够聪明,无法推断它是在使用反向引用时(即使在这种情况下,backref具有恒定长度).我们必须通过这个来处理正则表达式编译器,如下所示:
在实际的答案将不得不梅西耶:r"(.)(?<!(?=\1)..)\1{N-1}(?!\1)"
这可以解决re模块中的错误,(?=\1)..而不是\1.(这些在大多数情况下是等效的.)这使得正则表达式引擎可以准确地知道lookbehind断言的宽度,因此它可以在PCRE和re等中工作.
当然,现实世界的解决方案就像 [x.group() for x in re.finditer(r"(.)\1*", "xxaaaayyybbbbbzzccccxx") if len(x.group()) == 4]
我怀疑你想要使用否定前瞻: (.)\1{N-1}(?!\1).
但那说......我怀疑最简单的跨语言解决方案就是在不使用正则表达式的情况下自己编写.
更新:
^(.)\\1{3}(?!\\1)|(.)(?<!(?=\\2)..)\\2{3}(?!\\2) 对我来说更为普遍,包括从字符串开头开始的匹配.