u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
สิ่งที่ฉันต้องการคือเนื้อหาในวงเล็บ
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
สิ่งที่ฉันต้องการคือเนื้อหาในวงเล็บ
u"abcde(date='2/xc2/xb2',time='/case/test.png')"
ast
และไม่รู้ว่ามีอยู่จริง
คำตอบ:
หากปัญหาของคุณง่ายมากเพียงแค่นี้คุณไม่จำเป็นต้องใช้ regex:
s[s.find("(")+1:s.find(")")]
ใช้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'"
หากคุณต้องการค้นหาเหตุการณ์ทั้งหมด:
>>> 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']
.*
โลภ (จะจับคู่กันนานที่สุด) และ.*?
ไม่โลภ (จะจับคู่ให้สั้นที่สุด)
จากคำตอบของ tkerwin หากคุณมีวงเล็บซ้อนกันเช่นใน
st = "sum((a+b)/(c+d))"
คำตอบของเขาจะใช้ไม่ได้หากคุณต้องการนำทุกอย่างระหว่างวงเล็บเปิดแรกและวงเล็บปิดสุดท้ายเพื่อให้ได้(a+b)/(c+d)
มาเนื่องจากค้นหาการค้นหาจากด้านซ้ายของสตริงและจะหยุดที่วงเล็บปิดแรก
ในการแก้ไขคุณต้องใช้rfind
สำหรับส่วนที่สองของการดำเนินการจึงจะกลายเป็น
st[st.find("(")+1:st.rfind(")")]
import re
fancy = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
print(contents_re.groupdict()['contents'])