当前位置: 首页 > 面试题库 >

完全匹配相同字符的N个重复

穆鸿飞
2023-03-14
问题内容

如何编写一个与相同字符(或理想情况下,同一组)的N个重复恰好匹配的表达式?基本上是(.)\1{N-1}做什么的,但是有一个重要的限制:如果主题重复N次
以上,
则表达式应该失败。例如,给定N=4和字符串xxaaaayyybbbbbzzccccxx,表达式应该匹配aaaaccccbbbb

我不专注于任何特定的方言,可以随意使用任何语言。请不要发布仅适用于此特定示例的代码,我正在寻找一个通用的解决方案。


问题答案:

使用负前瞻 负后瞻。

这将是正则表达式(.)(?<!\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]



 类似资料:
  • 问题内容: 我有一个字符串,其中单词“ LOCAL”多次出现。我使用该函数搜索该单词,但它也返回另一个单词“ Locally”。我如何准确匹配“本地”一词? 问题答案: 对于这种事情,正则表达式非常有用: \ b基本上表示单词边界。可以是空格,标点符号等。 编辑评论: 显然,如果您不想忽略这种情况,则可以删除flags = re.IGNORECASE。

  • 问题内容: 我会在开头提到这个问题,尽管我离正则表达式专家很远,但是它们对我来说并不完全陌生。对于我来说,构建正则表达式来搜索特定字符串中的模式通常不是问题,但是我有一个(也许是?)独特的情况。 我有一组价值观,例如: 028938 DEF567987 390987.456 GHI345928.039 我想匹配一组特定的字符串,例如: 完全由6位数字组成的字符串 字符串,由正好6位数字,十进制组成

  • 我正在使用adobe javascript中的正则表达式在绘图标题栏中查找一串单词。从数字(1)开始,然后是日期,然后是不同数量的单词和4组首字母 图形标题栏示例具有以下内容: 1 20.09.16 此测试的更改 SB SB BW CR 0 29.07.16批准用于施工MM SB BW GM 正则表达式结果是 对于建筑MM SB BW GM 1 20.09.16本试验的变更 我需要正则表达式是 1

  • 问题内容: 我正在使用Elasticsearch,但有一段时间魔鬼般地要进行精确匹配。我已经尝试过match,query_string等的各种组合,但是我什么也没得到,或者得到了不好的结果。查询看起来像这样: 排序结果 我当然知道“狗”,“那只狗”和“狗”的得分相同,但是我需要弄清楚如何提高得分“狗”的精确匹配度。 我也试过 但这仍然给我 问题答案: 默认情况下,使用标准分析仪分析字段。如果您想检

  • 问题内容: 例如我有字符串: 结果,我希望具有以下匹配项: 我知道我可以这样写: 但是我认为我很丑,正在寻找更好的解决方案。我在寻找正则表达式解决方案,而不是自写的有限状态机。 问题答案: 您可以将其与: