2012-07-11 13 views
42
>>> match = re.findall(r'\w\w', 'hello') 
>>> print match 
['he', 'll'] 

Poiché \ w \ w indica due caratteri, sono previsti 'lui' e 'll'. Ma perché "el" e "lo" non corrispondono a e corrispondono all'espressione regolare?Come trovare corrispondenze sovrapposte con un'espressione regolare?

>>> match1 = re.findall(r'el', 'hello') 
>>> print match1 
['el'] 
>>> 
+2

[Lookahead] (http://stackoverflow.com/questions/320448/overlapping-matches-in-regex) –

risposta

70

findall non produce corrispondenze sovrapposte per impostazione predefinita. Questa espressione fa però:

>>> re.findall(r'(?=(\w\w))', 'hello') 
['he', 'el', 'll', 'lo'] 

Qui (?=...) è un lookahead assertion:

(?=...) Corrisponde se ... partite successive, ma non consuma alcuna della stringa . Questa è chiamata affermazione lookahead. Ad esempio, Isaac (?=Asimov) corrisponderà a 'Isaac ' solo se seguito da 'Asimov'.

7

Fatta eccezione per l'asserzione di lunghezza zero, il carattere nell'input sarà sempre utilizzato nell'abbinamento. Se ti trovi nel caso in cui desideri catturare un determinato carattere nella stringa di input più volte, avrai bisogno di un'asserzione di lunghezza zero nella regex.

ci sono diverse di lunghezza zero affermazione (ad es ^ (inizio input/linea), $ (fine dell'input/linea), \b (limite di parola)), ma guarda-around ((?<=) positiva look-dietro e (?=) sguardo positivo) sono l'unico modo per catturare il testo che si sovrappone all'input. Gli sguardi negativi ((?<!) negative look-behind, (?!) negative look-ahead) non sono molto utili qui: se affermano true, l'acquisizione interna non è riuscita; se affermano false, la partita fallisce. Queste asserzioni sono a lunghezza zero (come detto prima), il che significa che affermeranno senza consumare i caratteri nella stringa di input. Corrispondono effettivamente alla stringa vuota se passa l'asserzione.

L'applicazione delle conoscenze di cui sopra, una regex che funziona per il vostro caso sarebbe:

(?=(\w\w)) 
20

È possibile utilizzare il new Python regex module, che supporta la sovrapposizione partite.

>>> import regex as re 
>>> match = re.findall(r'\w\w', 'hello', overlapped=True) 
>>> print match 
['he', 'el', 'll', 'lo']