Regulärer Ausdruck, um Text zwischen Klammern zurückzugeben

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

Ich brauche nur den Inhalt in Klammern.

user469652
quelle
Klammern? Ich sehe keine Klammern. Meinten Sie Klammern?
kzh
4
Warum nicht doppelte Anführungszeichen verwenden? Es würde die Zeichenfolge leichter lesbar machen, dhu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh
Diese Frage macht mich nervös, wenn ich sie mir nur ansehe. Ich habe den Verdacht, dass OP die Funktionalität wirklich will astund einfach nicht weiß, dass sie existiert.
Kevin

Antworten:

245

Wenn Ihr Problem wirklich so einfach ist, brauchen Sie keinen regulären Ausdruck:

s[s.find("(")+1:s.find(")")]
tkerwin
quelle
9
Was ist, wenn es kein '(' und ')' gibt? Sie erhalten s [0: -1]. Was bedeutet, dass Sie alles in 's' bekommen: \. Es ist gut, wenn Sie zuerst überprüfen, ob die Zeichenfolge in Klammern steht.
Omar
5
Was ist, wenn Sie "(etwas Text (etwas Text in der inneren Klammer) etwas mehr Text)" haben?
Igor Pomaranskiy
4
Dann ist das Problem nicht so einfach wie das ursprüngliche Problem und erfordert eine andere Lösung.
Tkerwin
1
Zu Igor's Frage: Wenn Sie solche verschachtelten Klammern haben, verwenden Sie rfind für den zweiten Teil der Operation. Weitere Informationen hierzu finden Sie in meinem Beitrag unten.
FaustoW
61

Verwendung 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
quelle
45

Wenn Sie alle Vorkommen finden möchten:

>>> 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
quelle
mag eine blöde Frage sein, aber warum ist das "?" erforderlich ? Warum funktioniert "(. *)" Nicht?
CutePoison
3
@CutePoison, weil .*es gierig ist (wird das längste Match dauern) und .*?nicht gierig ist (wird das kürzeste Match nehmen)
Dopstar
29

Aufbauend auf der Antwort von tkerwin, wenn Sie zufällig verschachtelte Klammern wie in haben

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

Seine Antwort funktioniert nicht, wenn Sie alles zwischen der ersten öffnenden Klammer und der letzten schließenden Klammer nehmen müssen (a+b)/(c+d), um zu suchen, da Suchanfragen links von der Zeichenfolge gefunden werden und bei der ersten schließenden Klammer aufhören würden.

Um dies zu beheben, müssen Sie rfindfür den zweiten Teil der Operation verwenden, damit es wird

st[st.find("(")+1:st.rfind(")")]
FaustoW
quelle
1
@ALH dieser Ausdruck hat keine verschachtelte Klammer, wofür meine Antwort gut ist.
FaustoW
6
import re

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

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )
Anonym
quelle
2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])
stephen
quelle
Während dieser Code möglicherweise die Frage beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern
sshashank124