如何用re查找连续重复字符

20 投票
3 回答
30732 浏览
提问于 2025-04-17 00:06

我想在一个字符串中找到所有连续重复的字符块。比如,看看下面这个例子:

s = r'http://www.google.com/search=ooo-jjj'

我想找到这些:wwwooojjj

我试着这样做:

m = re.search(r'(\w)\1\1', s)

但是结果似乎没有达到我的预期。有没有什么好的建议?

另外,我该如何在Bash中实现这个呢?

3 个回答

0

这个代码几乎是对的,只需要把 search 换成 finditer。这样做会返回一个迭代器,而不是一个匹配结果,但是…:

m = [(x.start(),x.end()) for x in re.finditer(r'(\w)\1\1', s)]
3

下面的代码应该能解决你的问题:

s="abc def aaa bbb ccc def hhh"

for match in re.finditer(r"(\w)\1\1", s):
    print s[match.start():match.end()]
26

((\w)\2{2,}) 用来匹配三个或更多连续的字符:

In [71]: import re
In [72]: s = r'http://www.google.com/search=ooo-jjjj'
In [73]: re.findall(r'((\w)\2{2,})', s)
Out[73]: [('www', 'w'), ('ooo', 'o'), ('jjjj', 'j')]

In [78]: [match[0] for match in re.findall(r'((\w)\2{2,})', s)]
Out[78]: ['www', 'ooo', 'jjjj']

(\w) 可以匹配任何字母或数字字符。

((\w)\2) 匹配一个字母或数字字符后面跟着同样的字符,因为 \2 代表的是第二组匹配到的内容。由于我把括号嵌套了,所以第二组就是 \w 匹配到的字符。

把这些放在一起,((\w)\2{2,}) 就是匹配一个字母或数字字符,后面跟着同样的字符再重复两次或更多次

总的来说,这个正则表达式要求这个字符至少要重复三次。

撰写回答