2015-07-16 13 views
5

Sto usando Python 2.7.6. Non riesco a capire il seguente risultato da re.findall:Python regex findall alternation behavior

>>> re.findall('\d|\(\d,\d\)', '(6,7)') 
['(6,7)'] 

mi aspettavo quanto sopra per tornare ['6', '7'], perché secondo l'documentation:

'|'

A | B, dove A e B possono essere arbitrarie, crea un regolare un'espressione che corrisponderà sia A o B. Un numero arbitrario di possono essere separati dalla '|' in questo modo. Può essere utilizzato all'interno dei gruppi (vedere di seguito). Mentre la stringa di destinazione viene scansionata, le REs sono separate da '|' sono provati da sinistra a destra. Quando un pattern corrisponde completamente, quel ramo è accettato. Ciò significa che una volta che A corrisponde, B non verrà testato ulteriormente, anche se produrrebbe una corrispondenza complessiva più lunga di . In altre parole, il '|' l'operatore non è mai avido. Per abbinare un letterale '|', usare \ |, o racchiuderlo all'interno di una classe di caratteri , come in [|].

Grazie per il vostro aiuto

+1

'n [4]: ​​re.findall (r '\ d | \ d, \ d \)', '(6,7)') Out [4]: ​​['6', '7'] 'Incredibile quale differenza (fa, eh? Ha trovato una possibile corrispondenza per la seconda cosa prima, quindi è quello che è stato abbinato. – NightShadeQueen

+1

@hwnd L'esempio è inventato, I Sto cercando di capire il comportamento previsto qui. – Mayank

+1

"I RE separati da '|' sono provati da sinistra a destra." Forse questo significa da sinistra a destra nella stringa? In questo caso, '(' è più a sinistra della prima cifra: –

risposta

4

Come menzionato nel documento:

Questo significa che, una volta A corrisponde, B non verrà testata ulteriormente, anche se si dovesse avere una corrispondenza più generale.

Quindi, in questo caso il motore regex non corrisponde al \d perché le vostre stelle di stringa con ( e non \d così abbinerà il secondo caso che è \(\d,\d\). Ma se la stringa fissò con \d sarebbe partita \d:

>>> re.findall('\d|\d,\d\)', '6,7)') 
['6', '7'] 
+0

Comprensione dell'alba .. :) Grazie. – Mayank

+0

@Mayank Benvenuto! – Kasramvd