2011-02-04 17 views
52
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')' 

Tutto ciò di cui ho bisogno è il contenuto all'interno della parentesi.Espressione regolare per restituire il testo tra parentesi

+0

staffe? Non vedo alcuna parentesi. Intendevi parentesi? – kzh

+2

Perché non utilizzare le virgolette doppie? Renderebbe la stringa più facile da leggere, cioè "u" abcde (date = '2/xc2/xb2', time = '/ case/test.png') "' – kzh

+0

Questa domanda mi rende nervoso solo a guardarlo. Ottengo il sospetto cocente OP * davvero * vuole la funzionalità in 'ast' e semplicemente non sa che esiste. – Kevin

risposta

131

Se il problema è in realtà solo questa semplice, non hai bisogno di espressioni regolari:

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

cosa succede se non c'è '(' e ')'? otterrai s [0: -1]. Il che significa che otterrai qualunque cosa in "s": \. Sarà buono se verifichi che la stringa abbia prima la parentesi. – Omar

+1

Cosa succederebbe se avessi "(un po 'di testo (un po' di testo nella parentesi interna) un po 'più di testo)"? –

+0

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

28

Uso 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'" 
2
import re 

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

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

Se si desidera 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'] 
6

Basandosi su tkerwin's risposta, se vi capita di avere nidificato parentesi come in

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

la sua risposta non funziona se avete bisogno di prendere tutto tra il prima apertura parentesi e l'ultima chiusura parentesi per ottenere (a+b)/(c+d) , perché trova le ricerche dalla sinistra della stringa e si fermerebbe alla prima parentesi di chiusura.

Per rimediare, è necessario utilizzare rfind per la seconda parte dell'operazione, quindi sarebbe diventato

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