5

Devo trovare tutte le stringhe costituite solo da lettere 'a' e 'b' e ogni istanza di 'a' è immediatamente seguita da 'b' e immediatamente preceduta da 'b'.Come catturare l'intera stringa mentre usi 'lookaround' con caratteri in espressioni regolari?

Ad esempio:

mystring = 'bab babab babbab ab baba aba xyz' 

Poi il mio regex dovrebbe restituire:

['bab' 'babab' 'babbab'] 

(Nella stringa 'ab' - 'a' non è preceduto da 'b' Allo stesso modo per 'aba'. e 'xyz' non è fatta di solo 'a', 'b')

ho usato lookahead per questo e ha scritto questo regex:.

re.findall(r'((?<=b)a(?=b))',mystring) 

Ma questo mi restituisce solo tutte le istanze di 'a' che sono seguiti/preceduti da 'b', come:

['a','a','a','a'] 

ma ho bisogno di parole intere. Come posso trovare parole intere usando regex? Ho provato a modificare il mio regex con varie opzioni, ma niente sembra funzionare. Come si può fare?

risposta

3

È possibile utilizzare seguente espressione regolare:

>>> re.findall(r'\b(?:b+a)+b+\b',mystring) 
['bab', 'babab', 'babbab'] 

Regular expression visualization

Debuggex Demo

Come si può vedere dal diagramma precedente questa regex corrisponderà a qualsiasi combinazione di ba (che b può presentare più volte), che producono parole che ogni a precedono di b quindi l'intera stringa può essere seguita da uno o altro b.

+0

grazie mille, funziona. Dovrò migliorare la mia comprensione delle macchine a stati finiti –

0

Prova

re.findall(r'(b+ab+)+',mystring); 

se bbbabb sono anche permesso. Non hai bisogno di guardare avanti o indietro.

Edit: Sì, da abbinare anche babab (condiviso b sia per a), ecc dovrebbe essere

re.findall(r'(b+a)+b+',mystring); 
+0

grazie. Ma non funziona se la stringa contiene più di una istanza di 'a' come 'babab', 'babbab', 'babab' –

Problemi correlati