2013-07-04 12 views

risposta

6

penso utilizzando un'asserzione lookahead positivo dovrebbe fare il trucco:

>>> re.findall('(?=(a.*?a))', 'a 1 a 2 a 3 a 4 a') 
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a'] 

re.findall restituisce tutti i gruppi l'espressione regolare - compresi quelli in look-aheads. Funziona perché l'asserzione look-ahead non consuma alcuna stringa.

+0

Questo è il modo per farlo +1 –

4
r = re.compile('a.*?a') # as we use it multiple times 
matches = [r.match(s[i:]) for i in range(len(s))] # all matches, if found or not 
matches = [m.group(0) for m in matches if m] # matching string if match is not None 
print matches 

['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a'] 

Non so se è la soluzione migliore, ma qui ho testare ogni sottostringa raggiungendo alla fine della stringa per la corrispondenza con il modello di data.

5

È possibile utilizzare il modulo alternativo regex che permette incontri si sovrappongono:

>>> regex.findall('a.*?a', 'a 1 a 2 a 3 a 4 a', overlapped = True) 
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a'] 
+1

Sarà bello se/quando quel modulo mai sostituisce quella predefinita 're' modulo –

+0

@ JonClements Sì! Mi piacerebbe. A tutti i vantaggi offerti da questo modulo, è anche ben supportato. Ho trovato un bug e segnalato allo sviluppatore del modulo. È stato risolto in 24 ore. – ovgolovin

+0

lo ha cercato anche lui e non ha mai saputo che c'è un modulo "regex" meglio di "re" –