2011-02-04 11 views
52
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')' 

Potrzebuję tylko zawartości w nawiasie.Wyrażenie regularne do zwracania tekstu między nawiasem

+0

nawiasach? Nie widzę żadnych nawiasów. Miałeś na myśli nawias? – kzh

+2

Dlaczego nie używać podwójnych cudzysłowów? Ułatwiłoby to czytanie napisu, np. "U" abcde (date = '2/xc2/xb2', time = '/ case/test.png') "' – kzh

+0

To pytanie denerwuje mnie po prostu patrząc na to. Mam podejrzenie, że OP * naprawdę * chce funkcjonalności w 'ast' i po prostu nie wie, że istnieje. – Kevin

Odpowiedz

131

Jeśli problem jest tak naprawdę to proste, nie trzeba regex:

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

co, jeśli nie ma "(" i ")"? otrzymasz s [0: -1]. Co oznacza, że ​​dostaniesz cokolwiek w 's': \. Będzie dobrze, jeśli najpierw sprawdzisz, czy ciąg ma nawias. – Omar

+1

Co jeśli będziesz miał "(trochę tekstu (jakiś tekst w nawiasie wewnętrznym) trochę więcej tekstu)"? –

+0

Problem nie jest tak prosty jak pierwotny problem i wymaga innego rozwiązania. – tkerwin

28

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'" 
2
import re 

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

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

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

Budowanie na tkerwinie odpowiedź, jeśli zdarzy się, że zagnieżdżone nawiasy jak w

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

jego odpowiedź nie będzie działać, jeśli trzeba wziąć wszystko pomiędzy pierwszy otwierającym nawiasie a ostatnim zamykającym nawiasiedostać (a+b)/(c+d) , ponieważ wyszukiwa po lewej stronie napisu i zatrzyma się przy pierwszym zamykającym nawiasie.

Aby to naprawić, trzeba użyć rfind do drugiej części pracy, więc byłoby stać

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