Espressione regolare per restituire il testo tra parentesi


113
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

Tutto ciò di cui ho bisogno è il contenuto tra parentesi.


Parentesi? Non vedo nessuna parentesi. Volevi dire parentesi?
kzh

4
Perché non usare le virgolette doppie? u"abcde(date='2/xc2/xb2',time='/case/test.png')"
Renderebbe

Questa domanda mi rende nervoso solo a guardarla. Ho il vago sospetto che OP vuole davvero la funzionalità aste semplicemente non sa che esiste.
Kevin

Risposte:


247

Se il tuo problema è davvero solo così semplice, non hai bisogno di regex:

s[s.find("(")+1:s.find(")")]

10
cosa succede se non ci sono "(" e ")"? otterrai s [0: -1]. Il che significa che otterrai qualunque cosa in 's': \. Sarà utile se controlli prima che la stringa abbia le parentesi.
Omar

5
E se avessi "(del testo (del testo tra parentesi interne) dell'altro testo)"?
Igor Pomaranskiy

4
Quindi il problema non è semplice come il problema originale e richiederà una soluzione diversa.
tkerwin

1
Per la domanda di Igor: se hai parentesi nidificate in questo modo, usi rfind per la seconda parte dell'operazione. Vedi il mio post qui sotto per maggiori dettagli su questo.
FaustoW

61

Usa re.search(r'\((.*?)\)',s).group(1):

>>> import re
>>> s = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
>>> re.search(r'\((.*?)\)',s).group(1)
u"date='2/xc2/xb2',time='/case/test.png'"

45

Se vuoi trovare tutte le occorrenze:

>>> re.findall('\(.*?\)',s)
[u"(date='2/xc2/xb2',time='/case/test.png')", u'(eee)']

>>> re.findall('\((.*?)\)',s)
[u"date='2/xc2/xb2',time='/case/test.png'", u'eee']

potrebbe essere una domanda stupida, ma perché il "?" necessario? Perché "(. *)" Non funziona?
CutePoison

3
@CutePoison perché .*è avido (prenderà la partita più lunga) e .*?non è avido (prenderà la partita più breve)
dopstar

29

Basandosi sulla risposta di tkerwin, se ti capita di avere parentesi nidificate come in

st = "sum((a+b)/(c+d))"

la sua risposta non funzionerà se è necessario prendere tutto tra la prima parentesi aperta e l' ultima parentesi chiusa per ottenere (a+b)/(c+d), perché trova la ricerca dalla sinistra della stringa e si ferma alla prima parentesi chiusa.

Per risolvere questo problema, è necessario utilizzare rfindper la seconda parte dell'operazione, quindi diventerebbe

st[st.find("(")+1:st.rfind(")")]

1
@ALH quell'espressione non ha parentesi nidificate , che è ciò per cui è utile la mia risposta.
FaustoW

6
import re

fancy = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )

2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo su come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta
sshashank124
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.