可以用正则表达式匹配字符重复吗?怎么做?
问题:
用正则表达式能不能匹配一个单词,其中同一个字符出现在不同的位置上?
条件:
所有单词的长度都是一样的,你知道重复字符的位置(比如第1位、第2位和第4位),但你不知道这个字符是什么。
例子:
我想用小写的6个字母的单词,匹配那些第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 个回答
2
/(\b\w*?(\w)\2.*?\b)/
这个表达式会匹配任何包含至少一个字符重复的单词。
$1 代表整个单词,
$2 代表第一次重复的那个字符。
8
在这种情况下,你需要使用回溯引用。我不太确定你用的是什么编程语言,但我在我的VI编辑器中尝试了以下例子,来查找任何重复的字母。
正则表达式模式: \([a-z]\)\1
在这个例子中,[a-z]是你要查找的模式,把它放在括号里(在某些语言中,括号需要加上转义符)。一旦你有了括号,它就形成了一个组,可以在正则表达式的其他地方用\1来引用。如果有多个组,你可以用\1、\2等等。这里的\1会被第一个组匹配到的内容替换。
谢谢,
Arvind
54
你可以使用反向引用来实现这个功能:
(.)\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"