2012-07-10 19 views
5

C'è un modo per combinare i gruppi e le caratteristiche * delle espressioni regolari per agire come un tokenizer/splitter. Ho provato questo:I gruppi Regex e * i caratteri jolly possono funzionare insieme?

my_str = "foofoofoofoo" 
pattern = "(foo)*" 
result = re.search(pattern, my_str) 

speravo miei gruppi potrebbero apparire come

("foo", "foo", "foo", "foo") 

Ma non è così. Sono stato sorpreso da questo perché il? e le funzioni di gruppo funzionano insieme:

my_str= "Mr foo" 
pattern = "(Mr)? foo" 
result = re.search(pattern, my_str) 
+3

dubito che avrebbe funzionato, ma si può ottenere ciò che si vuole utilizzare 're.findall (" foo "," foofoofoofoo ")'. Oh, e per favore non usare 'str' come nome di variabile. –

+0

Ho cambiato 'str' in' my_str' dato che 'str' ombreggia il built-in. – jamylak

+0

ah si scusa, str era solo un esempio. Quel codice probabilmente non è sintatticamente corretto. Inoltre, ho visto il metodo di ricerca e che funzionerebbe sicuramente. Ero solo curioso in un senso più generale. –

risposta

4

Il problema è si ripete l'unico gruppo di acquisizione. Ciò significa che hai una sola parentesi ==> un gruppo di acquisizione e questo gruppo di acquisizione viene sovrascritto ogni volta che corrisponde.

Vedere Repeating a Capturing Group vs. Capturing a Repeated Group su regular-expression.info per ulteriori informazioni. (Ma anche catturare un gruppo ripetuto non è quello che vuoi)

Quindi, dopo aver terminato l'espressione regolare, il gruppo di cattura 1 conterrà l'ultimo "pippo" trovato.

Questo sarebbe darebbe il risultato previsto:

my_str = "foofoofoofoo" 
pattern = "foo" 
result = re.findall(pattern, my_str) 

risultato è quindi un elenco ['foo', 'foo', 'foo', 'foo']

+0

+1 per il link molto utile. Grazie! –

+0

interessante. Grazie. –

3

Cattura gruppi e * non funzionano con il modulo integrato - utilizzare invece la ricerca.

Esiste una libreria denominata regex in pypi che, a mio avviso, supporta la sintassi e ha alcune altre funzionalità come il back tracking a lunghezza variabile.

+0

Questo spiegherebbe le cose. Grazie. –

Problemi correlati