【问题标题】:It is possible to match a character repetition with regex? How?可以用正则表达式匹配字符重复吗?如何?
【发布时间】:2009-06-21 13:33:53
【问题描述】:

问题:
是否可以使用正则表达式匹配在不同位置包含相同字符的单词?

状况:
所有单词的长度相同,你知道重复字符的字符位置(例如第 1、第 2 和第 4 个),但你不知道它是什么。

示例:
使用小写的 6char 单词我想匹配第 3 个和第 4 个字符相同的单词。

parrot <- match for double r
follia <- match for double l 
carrot <- match for double r
mattia <- match for double t
rettoo <- match for double t
melone <- doesn't match

我不能使用量词 [\d]{2},因为它匹配任何连续的两个字符,如果我说第 2 位和第 4 位而不是第 3 位和第 4 位怎么办?

可以用正则表达式做我想做的事吗?如果是,我该怎么做?

编辑:
在cmets问问,我用的是python

【问题讨论】:

  • 正则表达式引擎在语言和工具之间会有很大差异。所以你应该总是说你正在使用什么语言或工具(Perl?Python?grep?C 和一个库?)
  • 这需要反向引用。严格来说,反向引用不是“常规的”,但所有常见的正则表达式引擎都支持它。

标签: python regex


【解决方案1】:

您可以使用反向引用来执行此操作:

(.)\1

这将匹配任何连续出现的字符。


编辑   下面是一些 Python 示例:

import re

regexp = re.compile(r"(.)\1")
data = ["parrot","follia","carrot","mattia","rettoo","melone"]

for str in data:
    match = re.search(regexp, str)
    if match:
        print str, "<- match for double", match.group(1)
    else:
        print str, "<- doesn't match"

【讨论】:

  • 晚了,但作为参考,可能值得注意的是,这个特定的正则表达式实际上只匹配字符的第一次重复 (re.search(r"(.)\1","parrrrrot" ).group(0) 产生'rr')。要匹配所有出现(并能够提取重复组),您可能需要使用: re.search(r"((.)\2+)", "parrrrot").group(1) (产生正确的回答'rrrr')
【解决方案2】:

对于这种情况,您需要使用反向引用。我不确定您使用的是哪种语言,我在我的 VI 编辑器中尝试了以下示例来搜索任何重复的字母。 模式正则表达式: \([a-z]\)\1

如果您看到该示例,则 [a-z] 是您要搜索的模式,并将其括在括号内(括号应在某些语言中进行转义)。一旦有了括号,它就是一个组,可以使用 \1 在正则表达式中的任何位置再次引用。如果有多个组,您可以使用 \1、\2 等。\1 将替换为第一组中匹配的任何内容。

谢谢 阿文德

【讨论】:

    【解决方案3】:

    /(\b\w*?(\w)\2.*?\b)/

    将匹配至少在字符重复上的任何单词 $1 是这个词 $2 第一次重复。

    【讨论】:

      【解决方案4】:

      是的,您可以使用反向引用构造来匹配双字母。

      正则表达式(?&lt;char&gt;\w)\k&lt;char&gt;,使用命名组和反向引用,搜索相邻的配对字符。当应用于字符串“I'll have a small coffee”时,它会在单词“I'll”、“small”和“coffee”中找到匹配项。元字符\w 查找任何单字字符。分组构造(?&lt;char&gt;) 包含元字符以强制正则表达式引擎记住子表达式匹配(在这种情况下,它将是任何单个字符)并将其保存在名称“char”下。反向引用构造\k&lt;char&gt; 使引擎将当前字符与存储在“char”下的先前匹配的字符进行比较。只要单个字符与前一个字符相同,整个正则表达式就会成功找到匹配项。

      【讨论】:

      • 您应该始终使用反引号或代码块来格式化您在帖子中包含的任何源代码。在我在你的正则表达式周围添加反引号之前,这个答案根本没有意义。
      • 糟糕!我的错!谢谢艾伦 :)
      猜你喜欢
      • 2017-10-04
      • 2011-02-04
      • 2016-10-24
      • 2018-07-17
      • 2013-06-03
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多