2011-08-22 18 views
8

Quiero encontrar todos los bloques de caracteres consecutivos y repetidos en una cadena. Por ejemplo, considere lo siguiente:Cómo usarlo para encontrar caracteres consecutivos y repetidos

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

Lo que yo quiero encontrar es: 'www', 'ooo' y 'jjj'. Intenté hacerlo así:

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

Pero parece que no funciona como esperaba. ¿Algunas ideas?

Además, ¿cómo puedo hacerlo en Bash?

+2

no funciona, ¿cómo exactamente? Encuentra la primera coincidencia. Si quieres todas las coincidencias a la vez, prueba con 'findall'. – tripleee

Respuesta

11

((\w)\2{2,}) partidos 3 o más caracteres consecutivos:

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

Me pregunto por qué re.findall (r '(\ w) {2,}) no funciona? – Alcott

+0

@Alcott: '(\ w) {2,}' coincidirá * cualquier * 2 o más caracteres. No requiere que los personajes sean iguales. – unutbu

+0

entonces ¿por qué ((\ w) \ 2 {2,}) funciona? No lo entiendo – Alcott

3

El siguiente código debería resolver su problema:

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

Funciona casi correcto, basta con sustituir search con finditer. Devuelve un iterador, no un partido, pero ...:

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