Expresión regular para devolver texto entre paréntesis


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

Todo lo que necesito es el contenido entre paréntesis.


¿Soportes? No veo ningún paréntesis. ¿Quiso decir paréntesis?
2011

4
¿Por qué no utilizar comillas dobles? u"abcde(date='2/xc2/xb2',time='/case/test.png')"
Facilitaría la

Esta pregunta me pone nerviosa con solo mirarla. Tengo la sospecha de que OP realmente quiere la funcionalidad asty simplemente no sabe que existe.
Kevin

Respuestas:


247

Si su problema es realmente así de simple, no necesita regex:

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

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

5
¿Qué pasa si tienes "(algo de texto (algo de texto entre paréntesis) más texto)"?
Igor Pomaranskiy

4
Entonces el problema no es tan simple como el problema original y requerirá una solución diferente.
tkerwin

1
Para la pregunta de Igor: si ha anidado paréntesis así, usa rfind para la segunda parte de la operación. Vea mi publicación a continuación para obtener más detalles sobre esto.
FaustoW

61

Utilizar 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

Si desea 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']

podría ser una pregunta estúpida, pero ¿por qué el "?" necesario ? ¿Por qué "(. *)" No funciona?
CutePoison

3
@CutePoison porque .*es codicioso (tomará el partido más largo) y .*?no es codicioso (tomará el partido más corto)
dopstar

29

Sobre la base de la respuesta de tkerwin, si tiene paréntesis anidados como en

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

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

Para solucionarlo, debe usar rfindpara la segunda parte de la operación, por lo que se convertiría en

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

1
@ALH esa expresión no tiene paréntesis anidados , que es para lo que es buena mi respuesta.
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'])

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta
sshashank124
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.