web-dev-qa-db-fra.com

Expression régulière pour retourner du texte entre parenthèses

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

Tout ce dont j'ai besoin, c'est du contenu à l'intérieur de la parenthèse.

81
user469652

Si votre problème est vraiment aussi simple, vous n'avez pas besoin de regex:

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

Utilisez 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'"
48
waan

Si vous voulez trouver toutes les occurrences:

>>> 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']
30
TheSoulkiller

S'appuyant sur la réponse de tkerwin, si vous avez des parenthèses imbriquées comme dans

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

sa réponse ne fonctionnera pas si vous devez tout prendre entre la première parenthèse ouvrante et la dernière parenthèse fermante pour obtenir (a+b)/(c+d), parce que les recherches sont effectuées à gauche de la chaîne et s’arrêtent à la première parenthèse fermante.

Pour résoudre ce problème, vous devez utiliser rfind pour la deuxième partie de l'opération, afin qu'il devienne

st[st.find("(")+1:st.rfind(")")]
18
FaustoW
import re

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

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