138 votes

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

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

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

1 votes

Des supports ? Je ne vois pas de parenthèses. Tu veux dire des parenthèses ?

5 votes

Pourquoi ne pas utiliser des guillemets ? Cela rendrait la chaîne plus facile à lire, par exemple u"abcde(date='2/xc2/xb2',time='/case/test.png')"

1 votes

Cette question me rend nerveux rien qu'en la regardant. Je soupçonne furtivement qu'OP vraiment veut la fonctionnalité dans ast et ne sait pas qu'il existe.

314voto

tkerwin Points 3876

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

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

15 votes

Et s'il n'y a pas de '(' et ')' ? Vous obtiendrez s[0:-1]. Ce qui signifie que vous obtiendrez tout ce qui se trouve dans 's' : \. Il serait bon que vous vérifiiez d'abord que la chaîne comporte des parenthèses.

6 votes

Et si vous avez "(un texte (un texte entre parenthèses) un autre texte)" ?

11 votes

Le problème n'est alors pas aussi simple que le problème initial et nécessitera une solution différente.

76voto

waan Points 881

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

63voto

TheSoulkiller Points 779

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

2 votes

C'est peut-être une question stupide, mais pourquoi le " ?" est-il nécessaire ? Pourquoi "(.*)" ne fonctionne-t-il pas ?

9 votes

@CutePoison parce que .* est gourmand (il prendra la correspondance la plus longue) et .*? n'est pas gourmand (il prendra la correspondance la plus courte)

0 votes

MERCI ! Probablement la meilleure réponse de la soirée !

36voto

FaustoW Points 26

Dans le prolongement de la réponse de tkerwin, si vous avez parenthèses imbriquées comme dans

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

Cette réponse ne fonctionnera pas si vous avez besoin de tout prendre entre le premièrement parenthèse ouvrante et le dernier parenthèse fermante pour obtenir (a+b)/(c+d) car find cherche à partir de la gauche de la chaîne et s'arrête à la première parenthèse fermante.

Pour corriger cela, vous devez utiliser rfind pour la deuxième partie de l'opération, de sorte qu'elle deviendrait

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

9voto

Anonymous Points 91
import re

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X