Expressão regular para retornar texto entre parênteses

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

Tudo que eu preciso é o conteúdo entre parênteses.

user469652
fonte
Suportes? Não vejo nenhum colchete. Você quis dizer parênteses?
kzh
4
Por que não usar aspas duplas? Ele faria a corda mais fácil de ler, ou sejau"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh
Essa pergunta me deixa nervoso só de olhar. Eu recebo a suspeita de que OP realmente quer a funcionalidade aste simplesmente não sabe que ela existe.
Kevin

Respostas:

247

Se o seu problema for realmente tão simples, você não precisa de regex:

s[s.find("(")+1:s.find(")")]
Tkerwin
fonte
9
e se não houver '(' e ')'? você obterá s [0: -1]. O que significa que você obterá qualquer coisa em 's': \. Será bom se você verificar se a string tem parênteses primeiro.
Omar
5
E se você tiver "(algum texto (algum texto entre parênteses) um pouco mais de texto)"?
Igor Pomaranskiy
4
Então, o problema não é tão simples quanto o problema original e exigirá uma solução diferente.
tkerwin
1
Para a pergunta de Igor: se você aninhou parênteses assim, você usa rfind para a segunda parte da operação. Veja meu post abaixo para mais detalhes sobre isso.
FaustoW de
61

Use 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
fonte
45

Se você deseja encontrar todas as ocorrências:

>>> 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']
TheSoulkiller
fonte
pode ser uma pergunta estúpida, mas por que o "?" necessário ? Por que "(. *)" Não funciona?
CutePoison
3
@CutePoison porque .*é ganancioso (terá a partida mais longa) e .*?não é ganancioso (fará a partida mais curta)
dopstar
29

Com base na resposta de tkerwin, se acontecer de você ter parênteses aninhados como em

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

sua resposta não funcionará se você precisar pegar tudo entre o primeiro parêntese de abertura e o último parêntese de fechamento para obter (a+b)/(c+d), porque localizar procura da esquerda da string e pararia no primeiro parêntese de fechamento.

Para consertar isso, você precisa usar rfindpara a segunda parte da operação, então ela se tornaria

st[st.find("(")+1:st.rfind(")")]
FaustoW
fonte
1
@ALH essa expressão não tem parênteses aninhados , e é para isso que serve minha resposta.
FaustoW
6
import re

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

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )
Anônimo
fonte
2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])
Stephen
fonte
Embora este código possa responder à pergunta, fornecer contexto adicional sobre como e / ou por que ele resolve o problema melhoraria o valor de longo prazo da resposta
sshashank124