问题:
使用正则表达式可以匹配在不同位置包含相同字符的单词吗?
条件:
所有单词都有相同的长度,你知道重复字符的字符位置(例如第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
答案 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”下的先前匹配的字符进行比较。只要单个字符与前一个字符相同,整个正则表达式就会成功找到匹配项。