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.