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.

usuario469652
fuente
¿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(")")]
tkerwin
fuente
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'"
waan
fuente
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']
El asesino de almas
fuente
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(")")]
FaustoW
fuente
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 )
Anónimo
fuente
2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])
Stephen
fuente
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