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.


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(")")]

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

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

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(")")]

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 )

2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.