कोष्ठक के बीच पाठ वापस करने के लिए नियमित अभिव्यक्ति


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

मुझे जो भी चाहिए वो है कोष्ठक के अंदर की सामग्री।


कोष्ठक? मुझे कोई कोष्ठक नहीं दिखता। क्या आप कोष्ठक का मतलब है?
kzh

4
दोहरे उद्धरण चिह्नों का उपयोग क्यों नहीं करते? यह स्ट्रिंग को पढ़ने में आसान बना देगा, अर्थातu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh

यह सवाल मुझे घबराता है बस इसे देख रहा हूं। मुझे लगता है कि संदेह ओपी वास्तव में कार्यक्षमता चाहता है astऔर इसमें मौजूद नहीं है।
केविन

जवाबों:


247

यदि आपकी समस्या वास्तव में सिर्फ इतनी सरल है, तो आपको regex की आवश्यकता नहीं है:

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

9
क्या होगा अगर कोई '(' और ')' नहीं है? आपको s [0: -1] मिलेगा। जिसका अर्थ है कि आपको 's': \ _ में जो भी मिलेगा। यह अच्छा होगा यदि आप जांच लें कि स्ट्रिंग में पहले कोष्ठक है।
उमर

5
क्या होगा यदि आपके पास "(कुछ पाठ (आंतरिक कोष्ठक में कुछ पाठ) कुछ और पाठ)"?
इगोर पोमरान्स्की

4
फिर समस्या मूल समस्या की तरह सरल नहीं है और इसके लिए एक अलग समाधान की आवश्यकता होगी।
टकेरविन

1
इगोर के सवाल के लिए: यदि आपने उस तरह के कोष्ठक को नेस्टेड किया है, तो आप ऑपरेशन के दूसरे भाग के लिए रिफ़्डेंस का उपयोग करते हैं। इस बारे में अधिक जानकारी के लिए नीचे मेरी पोस्ट देखें।
FaustoW

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
@CutePoison क्योंकि .*लालची है (सबसे लंबा मैच लेगा) और .*?लालची नहीं है (सबसे छोटा मैच
लेगा

29

टेकरविन के उत्तर पर निर्माण, यदि आप ऐसा करते हैं कि जैसे नेस्टेड कोष्ठक हैं

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

उसके जवाब यदि आप के बीच सब कुछ लेने की जरूरत काम करेंगे नहीं पहले आरंभिक कोष्ठक और पिछले समापन कोष्ठक प्राप्त करने के लिए (a+b)/(c+d), क्योंकि से खोज खोज स्ट्रिंग के लिए छोड़ दिया है, और पहले समापन कोष्ठक में बंद कर देंगे।

इसे ठीक करने के लिए, आपको rfindऑपरेशन के दूसरे भाग के लिए उपयोग करने की आवश्यकता है , इसलिए यह बन जाएगा

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

1
@ALH की अभिव्यक्ति में नेस्टेड कोष्ठक नहीं है , जो कि मेरे उत्तर के लिए अच्छा है।
20


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

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या कैसे और / या क्यों हल करता है के बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा
sshashank124
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.