可以将字符重复与正则表达式匹配吗?怎么样?

时间:2009-06-21 13:33:54

标签: python regex

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

条件:
所有单词都有相同的长度,你知道重复字符的字符位置(例如第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个怎么办?

是否可以使用正则表达式执行我想要的操作?如果是,我该怎么做?

修改
在评论中询问,我正在使用python

4 个答案:

答案 0 :(得分:34)

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

(.)\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"

答案 1 :(得分:8)

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

如果你看到这个例子,[a-z]是你要搜索的模式,并将其包含在paranthesis中(parantheses应该以某些语言进行转义)。一旦你有一个paranthesis,它是一个组,可以通过使用\ 1再次在正则表达式的任何地方引用。如果有多个组,则可以使用\ 1,\ 2等。\ 1将替换为第一组中匹配的任何组。

由于 Arvind的

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

使用命名组和反向引用的正则表达式(?<char>\w)\k<char>搜索相邻的配对字符。当应用于字符串“我将有一个小咖啡”时,它会在“我会”,“小”和“咖啡”中找到匹配。元字符\w找到任何单字字符。分组构造(?<char>)包含元字符以强制正则表达式引擎记住子表达式匹配(在本例中,将是任何单个字符)并将其保存在名称“char”下。反向引用构造\k<char>使引擎将当前字符与存储在“char”下的先前匹配的字符进行比较。只要单个字符与前一个字符相同,整个正则表达式就会成功找到匹配项。