นิพจน์ทั่วไปเพื่อส่งคืนข้อความระหว่างวงเล็บ


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

สิ่งที่ฉันต้องการคือเนื้อหาในวงเล็บ


วงเล็บ? ไม่เห็นมีวงเล็บเลย คุณหมายถึงวงเล็บใช่ไหม
kzh

4
ทำไมไม่ใช้เครื่องหมายคำพูดคู่? มันจะทำให้สตริงอ่านง่ายขึ้นเช่นu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh

คำถามนี้ทำให้ฉันรู้สึกกังวลเมื่อมองไปที่มัน ฉันได้รับความสงสัยที่แอบสงสัย OP ต้องการฟังก์ชั่นการใช้งานจริงๆastและไม่รู้ว่ามีอยู่จริง
Kevin

คำตอบ:


252

หากปัญหาของคุณง่ายมากเพียงแค่นี้คุณไม่จำเป็นต้องใช้ regex:

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

10
จะเกิดอะไรขึ้นถ้าไม่มี '(' และ ')'? คุณจะได้รับ s [0: -1] ซึ่งหมายความว่าคุณจะได้รับอะไรก็ตามใน 's': \. จะเป็นการดีถ้าคุณตรวจสอบว่าสตริงมีวงเล็บก่อน
Omar

5
จะเกิดอะไรขึ้นถ้าคุณมี "(ข้อความบางส่วน (ข้อความบางส่วนในวงเล็บด้านใน) ข้อความเพิ่มเติม)"
Igor Pomaranskiy

4
จากนั้นปัญหาก็ไม่ง่ายเหมือนปัญหาเดิมและจะต้องมีวิธีแก้ไขที่แตกต่างออกไป
tkerwin

1
สำหรับคำถามของ Igor: หากคุณมีวงเล็บซ้อนกันแบบนั้นคุณใช้ rfind สำหรับส่วนที่สองของการดำเนินการ ดูโพสต์ของฉันด้านล่างสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้
FaustoW

63

ใช้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'"

46

หากคุณต้องการค้นหาเหตุการณ์ทั้งหมด:

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

อาจจะเป็นคำถามโง่ ๆ แต่ทำไม "?" จำเป็น? ทำไม "(. *)" ไม่ทำงาน
CutePoison

3
@CutePoison เพราะ.*โลภ (จะจับคู่กันนานที่สุด) และ.*?ไม่โลภ (จะจับคู่ให้สั้นที่สุด)
dopstar

30

จากคำตอบของ tkerwin หากคุณมีวงเล็บซ้อนกันเช่นใน

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

คำตอบของเขาจะใช้ไม่ได้หากคุณต้องการนำทุกอย่างระหว่างวงเล็บเปิดแรกและวงเล็บปิดสุดท้ายเพื่อให้ได้(a+b)/(c+d)มาเนื่องจากค้นหาการค้นหาจากด้านซ้ายของสตริงและจะหยุดที่วงเล็บปิดแรก

ในการแก้ไขคุณต้องใช้rfindสำหรับส่วนที่สองของการดำเนินการจึงจะกลายเป็น

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

1
@ALH นิพจน์นั้นไม่มีวงเล็บซ้อนซึ่งเป็นสิ่งที่ฉันตอบได้ดี
FaustoW


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

แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือสาเหตุที่แก้ปัญหาได้จะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
sshashank124
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.