Ekspresi reguler untuk mengembalikan teks di antara tanda kurung

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

Yang saya butuhkan hanyalah konten di dalam tanda kurung.

pengguna469652
sumber
Kurung? Saya tidak melihat tanda kurung apa pun. Apakah yang Anda maksud dalam tanda kurung?
kzh
4
Mengapa tidak menggunakan tanda kutip ganda? Ini akan membuat string lebih mudah dibaca, yaituu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh
Pertanyaan ini membuat saya gugup hanya dengan melihatnya. Saya mendapatkan kecurigaan yang menyelinap OP benar-benar menginginkan fungsionalitas tersebut astdan tidak tahu itu ada.
Kevin

Jawaban:

247

Jika masalah Anda benar-benar sesederhana ini, Anda tidak perlu regex:

s[s.find("(")+1:s.find(")")]
tkerwin
sumber
10
bagaimana jika tidak ada '(' dan ')'? Anda akan mendapatkan s [0: -1]. Yang berarti Anda akan mendapatkan apa pun di 's': \. Akan lebih baik jika Anda memeriksa bahwa string memiliki tanda kurung terlebih dahulu.
Omar
5
Bagaimana jika Anda akan memiliki "(beberapa teks (beberapa teks dalam tanda kurung) beberapa teks lagi)"?
Igor Pomaranskiy
4
Maka masalah tersebut tidak sesederhana masalah aslinya dan akan membutuhkan solusi yang berbeda.
tkerwin
1
Untuk pertanyaan Igor: jika Anda memiliki tanda kurung bertingkat seperti itu, Anda menggunakan rfind untuk bagian kedua dari operasi tersebut. Lihat posting saya di bawah ini untuk lebih jelasnya tentang ini.
FaustoW
61

Penggunaan 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
sumber
45

Jika Anda ingin menemukan semua kemunculan:

>>> 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
sumber
mungkin pertanyaan yang bodoh, tapi mengapa "?" dibutuhkan? Mengapa "(. *)" Tidak berfungsi?
CutePoison
3
@CutePoison karena .*serakah (akan mengambil pertandingan terlama) dan .*?tidak serakah (akan mengambil pertandingan terpendek)
dopstar
29

Berdasarkan jawaban tkerwin, jika Anda kebetulan memiliki tanda kurung bersarang seperti di

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

jawabannya tidak akan berfungsi jika Anda perlu mengambil semuanya di antara kurung buka pertama dan penutup terakhir untuk mendapatkan (a+b)/(c+d), karena temukan pencarian dari kiri string, dan akan berhenti di tanda kurung tutup pertama.

Untuk memperbaikinya, Anda perlu menggunakan rfinduntuk bagian kedua dari operasi, jadi itu akan menjadi

st[st.find("(")+1:st.rfind(")")]
FaustoW
sumber
1
@ALH ekspresi itu tidak memiliki tanda kurung bersarang , itulah gunanya jawaban saya.
FaustoW
6
import re

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

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )
Anonim
sumber
2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])
stephen
sumber
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jangka panjang jawaban
sshashank124