2011-08-22 19 views
8

Chcę znaleźć wszystkie kolejne, powtarzające się bloki znaków w ciągu znaków. Rozważmy na przykład:Jak korzystać z re, aby znaleźć kolejne, powtarzające się znaki

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

Co chcę znaleźć to: "www", "ooo" i "jjj". Próbowałem zrobić to tak:

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

Ale nie wydaje się działać tak, jak się spodziewam. Jakieś pomysły?

Ponadto, jak mogę to zrobić w Bash?

+2

nie działa jak dokładnie? Znajduje pierwszy mecz. Jeśli chcesz wszystkie mecze jednocześnie, spróbuj 'findall'. – tripleee

Odpowiedz

11

((\w)\2{2,}) mecze 3 lub więcej kolejnych znaków:

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

Zastanawiam się, dlaczego re.findall (r '(\ w) {2,}) nie działa? – Alcott

+0

@Alcott: '(\ w) {2,}' dopasuje * dowolne * 2 lub więcej znaków. Nie wymaga, aby postacie były takie same. – unutbu

+0

następnie dlaczego ((\ w) \ 2 {2,}) działa? Nie rozumiem tego. – Alcott

3

Poniższy kod powinien rozwiązać problem:

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

To działa prawie w porządku, po prostu zastąpić search z finditer. Zwraca iterator, a nie mecz, ale ...:

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