如何使用re来查找连续的,重复的字符

时间:2011-08-22 12:57:00

标签: python regex

我想在字符串中找到所有连续重复的字符块。例如,请考虑以下事项:

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

我想要找到的内容:wwwooojjj

我试着这样做:

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

但它似乎没有像我期望的那样起作用。有什么想法吗?

另外,我怎么能在Bash中做到这一点?

3 个答案:

答案 0 :(得分:12)

((\w)\2{2,})匹配3个或更多连续字符:

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匹配组号2的内容。 由于我嵌套了括号,因此第2组引用了\w匹配的字符。

然后把它们放在一起, ((\w)\2{2,})匹配任何字母数字字符,后跟相同的字符重复 2次或更多次

总的来说,这意味着正则表达式要求角色重复3次或更多次。

答案 1 :(得分: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()]

答案 2 :(得分:0)

它几乎正常,只需将search替换为finditer即可。它返回一个迭代器,而不是匹配但是......:

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