প্রথম বন্ধনীর মধ্যে পাঠ্য ফেরত দেওয়ার জন্য নিয়মিত প্রকাশ


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

আমার কেবলমাত্র প্রথম বন্ধনীর ভিতরে থাকা বিষয়বস্তু।


বন্ধনী? আমি কোনও বন্ধনী দেখতে পাচ্ছি না। আপনি কি প্রথম বন্ধনী বলতে চাচ্ছেন?
kzh

4
ডাবল কোট ব্যবহার করবেন না কেন? এটি স্ট্রিংটি পড়া সহজ করে তুলবে, অর্থাত্u"abcde(date='2/xc2/xb2',time='/case/test.png')"
কেজেড

এই প্রশ্নটি আমাকে কেবল তাকিয়ে দেখে নার্ভাস করে। আমি লুক্কায়িত সন্দেহ পেয়েছি ওপি সত্যিই কার্যকারিতা চায় astএবং এটি বিদ্যমান তা জানেন না।
কেভিন

উত্তর:


247

আপনার সমস্যাটি যদি সত্যিই কেবল এই সাধারণ হয় তবে আপনার রেইগেক্সের দরকার নেই:

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

9
'(' এবং ')' না থাকলে কী হবে? আপনি এস পাবেন [0: -1] যার অর্থ আপনি 's' তে যা কিছু পাবেন: \ \ স্ট্রিংয়ের প্রথম বন্ধনী আছে কিনা তা পরীক্ষা করে নিলে ভাল হবে be
ওমর

5
আপনার যদি "(কিছু পাঠ্য (অভ্যন্তরীণ বন্ধনীতে কিছু পাঠ্য)) আরও কিছু পাঠ্য থাকে তবে"?
ইগোর পোমারানস্কি

4
তাহলে সমস্যাটি মূল সমস্যার মতো সহজ নয় এবং এর জন্য আলাদা সমাধানের প্রয়োজন হবে।
টেকারউইন

1
ইগরের প্রশ্নের জন্য: আপনি যদি এমনভাবে প্রথম বন্ধনী রেখে থাকেন তবে আপনি অপারেশনের দ্বিতীয় অংশের জন্য rfind ব্যবহার করেন। এই সম্পর্কে আরও তথ্যের জন্য নীচে আমার পোস্ট দেখুন।
ফ্যাসোস্টাব্লু

61

ব্যবহার 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

আপনি যদি সমস্ত উপস্থিতি সন্ধান করতে চান:

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

একটি বোকা প্রশ্ন হতে পারে, কিন্তু "কেন?" দরকার? "(। *)" কাজ করে না কেন?
কিউটপোইজন

3
@ কুটপয়েসন কারণ .*লোভী (দীর্ঘতম ম্যাচটি নেবে) এবং .*?লোভী নয় (সবচেয়ে সংক্ষিপ্ত ম্যাচটি নেবে)
ডপস্টার

29

টেকারউইনের উত্তরের উপর ভিত্তি করে তৈরি করা, যদি আপনার মতো নেস্টেড প্রথম বন্ধনী থাকে

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

তার উত্তর আপনি মধ্যবর্তী সবকিছুর নেওয়া প্রয়োজন কাজ করবে না প্রথম খোলার প্রথম বন্ধনী এবং গত সমাপনী প্রথম বন্ধনী পেতে (a+b)/(c+d), কারণ থেকে খোঁজ অনুসন্ধান স্ট্রিং এর বাম, এবং প্রথম সমাপনী প্রথম বন্ধনী থামবে হবে।

এটি ঠিক করার জন্য, আপনাকে rfindঅপারেশনের দ্বিতীয় অংশের জন্য ব্যবহার করতে হবে, তাই এটি হয়ে যাবে

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

1
@ ALH যে অভিব্যক্তিতে নেস্টেড প্রথম বন্ধনী নেই, যা আমার উত্তরটির পক্ষে ভাল।
ফ্যাসোস্টাব্লু


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

এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে
শশাঙ্ক 124
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.