Wyrażenie regularne zwracające tekst w nawiasach


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

Potrzebuję tylko zawartości w nawiasach.


Wsporniki? Nie widzę żadnych nawiasów. Czy chodziło Ci o nawias?
kzh

4
Dlaczego nie używać podwójnych cudzysłowów? u"abcde(date='2/xc2/xb2',time='/case/test.png')"
Uczyniłoby to

To pytanie denerwuje mnie, gdy na nie patrzę. Dostaję podstępne podejrzenie, że OP naprawdę chce mieć tę funkcjonalność asti po prostu nie wie, że istnieje.
Kevin

Odpowiedzi:


247

Jeśli twój problem jest naprawdę prosty, nie potrzebujesz wyrażenia regularnego:

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

10
co jeśli nie ma „(” i „)”? otrzymasz s [0: -1]. Co oznacza, że ​​dostaniesz wszystko w 's': \. Będzie dobrze, jeśli najpierw sprawdzisz, czy łańcuch ma nawiasy.
Omar

5
Co jeśli będziesz mieć „(trochę tekstu (jakiś tekst w nawiasach wewnętrznych) trochę więcej tekstu)”?
Igor Pomaranskiy

4
Wtedy problem nie jest tak prosty jak pierwotny i będzie wymagał innego rozwiązania.
tkerwin 13.07.16

1
Na pytanie Igora: jeśli masz takie zagnieżdżone nawiasy, używasz rfind w drugiej części operacji. Zobacz mój post poniżej, aby uzyskać więcej informacji na ten temat.
FaustoW

61

Zastosowanie 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

Jeśli chcesz znaleźć wszystkie wystąpienia:

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

może być głupim pytaniem, ale dlaczego pojawia się „?” potrzebne ? Dlaczego „(. *)” Nie działa?
CutePoison

3
@CutePoison, ponieważ .*jest chciwy (najdłuższy mecz) i .*?nie jest chciwy (wybierze najkrótszy mecz)
dopstar

29

Opierając się na odpowiedzi tkerwina, jeśli zdarzy się, że masz zagnieżdżone nawiasy, takie jak w

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

Jego odpowiedź nie będzie działać, jeśli trzeba wziąć wszystko pomiędzy pierwszym otwierającym nawiasie i ostatniego zamknięcia nawiasu do uzyskania (a+b)/(c+d), ponieważ wyszukiwania Znajdź z lewej strony napisu, a zatrzyma przy pierwszym zamykającym nawiasie.

Aby to naprawić, musisz użyć rfinddo drugiej części operacji, aby tak się stało

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

1
@ALH to wyrażenie nie ma zagnieżdżonych nawiasów, do czego służy moja odpowiedź.
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'])

Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi
sshashank124
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.