使用负前瞻 和 负后瞻。
这将是正则表达式:
(.)(?<!1.)1{N-1}(?!1)除了Python的re模块已损坏(请参阅此链接)。
英文翻译:“匹配任何字符。请确保在匹配该字符之后,它之前的字符也不是该字符。再匹配该字符的N-1个重复。请确保这些重复之后的字符也不是字符。”
不幸的是,re模块(和大多数正则表达式引擎)已损坏,因为您不能在后置断言中使用反向引用。向后断言必须为恒定长度,并且编译器不够聪明,无法推断出何时使用了反向引用(即使在这种情况下,反向引用也具有恒定长度)。我们必须通过这种方式来处理正则表达式编译器,如下所示:
在 实际的答案 将是混乱:
r"(.)(?<!(?=1)..)1{N-1}(?!1)"
这可以通过使用
(?=1)..代替
1.(在大多数情况下,它们是等效的)解决re模块中的错误。这使regex引擎确切知道后置断言的宽度,因此可以在PCRE和re中工作。
当然,现实世界中的解决方案就像
[x.group() for x in re.finditer(r"(.)1*","xxaaaayyybbbbbzzccccxx") if len(x.group()) == 4]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)