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

Todo lo que necesito es el contenido dentro del paréntesis.Expresión regular para devolver texto entre paréntesis

+0

soportes? No veo ningún paréntesis. ¿Te refieres a paréntesis? – kzh

+2

¿Por qué no utilizar comillas dobles? Haría que la cadena sea más fácil de leer, es decir, 'u "abcde (date =' 2/xc2/xb2 ', time ='/case/test.png ')" ' – kzh

+0

Esta pregunta me pone nervioso solo de mirarla. Tengo la sospecha oculta OP * realmente * quiere la funcionalidad en 'ast' y simplemente no sabe que existe. – Kevin

Respuesta

131

Si su problema es realmente así de sencillo, que no necesita de expresiones regulares:

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

¿Qué pasa si no hay '(' y ')'? obtendrás s [0: -1]. Lo que significa que obtendrás lo que sea en 's': \. Será bueno si comprueba que la cadena tiene paréntesis primero. – Omar

+1

¿Qué pasa si tienes "(texto algo (texto entre paréntesis) más texto)"? –

+0

Entonces el problema no es tan simple como el problema original y requerirá una solución diferente. – 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

Si usted quiere encontrar todas las ocurrencias:

>>> 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

Construyendo en tkerwin's respuesta, si le sucede que tiene anidado paréntesis, al igual que en

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

su respuesta no funcionará si necesita tomar todo entre el primera paréntesis de apertura y la última paréntesis de cierre para obtener (a+b)/(c+d) , porque encuentra búsquedas desde la izquierda de la cadena, y se detendría en el primer paréntesis de cierre.

Para corregir esto, es necesario utilizar rfind para la segunda parte de la operación, por lo que se convertiría en

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