2011-08-22 17 views
8

Voglio trovare tutti i blocchi di carattere ripetuti consecutivi in ​​una stringa. Ad esempio, si consideri il seguente:Come utilizzare re per trovare caratteri ripetuti e ripetuti

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

Quello che voglio trovare è: 'www', 'ooo' e 'jjj'. Ho provato a farlo in questo modo:

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

Ma non sembra funzionare come mi aspetto. Qualche idea?

Inoltre, come posso farlo in Bash?

+2

non funziona come esattamente? Trova la prima partita. Se vuoi tutte le partite contemporaneamente, prova a 'findall'. – tripleee

risposta

11

((\w)\2{2,}) partite 3 o più caratteri consecutivi:

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

Mi chiedo perché re.findall (r '(\ w) {2,}) non funzioni? – Alcott

+0

@Alcott: '(\ w) {2,}' corrisponderà a * qualsiasi * 2 o più caratteri. Non richiede che i personaggi siano uguali. – unutbu

+0

allora perché ((\ w) \ 2 {2,}) funziona? Non capisco – Alcott

3

Il seguente codice dovrebbe risolvere il 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

Funziona quasi ragione, basta sostituire search con finditer. Esso restituisce un iteratore, non una partita, ma ...:

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