2011-08-22 70 views
8

我想查找字符串中所有連續的重複字符塊。例如,請考慮以下內容:如何使用re來查找連續的重複字符

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

我想查找的是'www','ooo'和'jjj'。我試圖這樣做:

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

但它似乎並沒有像我期望的那樣工作。有任何想法嗎?

另外,我該怎麼做在Bash?

+2

不工作究竟如何?它找到第一場比賽。如果你想一次所有的匹配,請嘗試'findall'。 – tripleee

回答

11

((\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'] 
+0

我有點奇怪爲什麼re.findall(r'(\ w){2,})不起作用? – Alcott

+0

@Alcott:'(\ w){2,}'將匹配任何* 2個或更多字符。它不要求字符相同。 – unutbu

+0

那麼爲什麼((\ w)\ 2 {2,})有效?我不明白。 – Alcott

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()] 
0

它的工作原理差不多吧,只是finditer取代search。它返回一個迭代器,而不是一個比賽,但...:

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