2009-04-19 9 views
79

Come faccio a fare un'espressione regolare di python come "(. *)" Tale che, dato "a (b) c (d) e" python corrisponde "b" invece di "b) c (d "?Python non-goloso regex

So che posso usare" [^)] "invece di". ", Ma sto cercando una soluzione più generale che mantenga la mia regex un po 'più pulita. C'è un modo per dire a python "hey, abbinalo al più presto possibile"?

risposta

11

Non sarebbe \\(.*?\\) lavoro? Questa è la sintassi non-golosa.

51
>>> x = "a (b) c (d) e" 
>>> re.search(r"\(.*\)", x).group() 
'(b) c (d)' 
>>> re.search(r"\(.*?\)", x).group() 
'(b)' 

According to the docs:

Il '*', '+', e '' ? qualificatori sono tutti avidi; abbinano più testo possibile. A volte questo comportamento non è desiderato; se il RE <.*> corrisponde a "<H1>title</H1>", corrisponderà all'intera stringa e non solo a "<H1>". Aggiungendo '?' dopo che il qualificatore ha eseguito la partita in modo non avido o minimo; il minor numero possibile di caratteri sarà abbinato. L'utilizzo di .*? nell'espressione precedente corrisponderà solo a "<H1>".

+1

[Non analizzare mai HTML con espressioni regolari] (https://stackoverflow.com/a/1732454) –

2

Vuoi che corrisponda "(b)"? Fai come hanno suggerito Zitrax e Paolo. Vuoi che corrisponda a "b"? Do

>>> x = "a (b) c (d) e" 
>>> re.search(r"\((.*?)\)", x).group(1) 
'b' 
2

utilizzi una corrispondenza ungreedy è un buon inizio, ma mi piacerebbe anche suggerire che si riconsiderare qualsiasi uso di .* - che dire di questo?

groups = re.search(r"\([^)]*\)", x) 
5

Come hanno detto gli altri utilizzando il? il modificatore sul quantificatore risolverà il tuo problema immediato, ma fai attenzione, stai iniziando a deviare in aree in cui le regex cessano di funzionare e hai bisogno di un parser. Ad esempio, la stringa "(foo (barra)) baz" causerà problemi.