2015-06-10 3 views
5

में ब्रैकेट खोजने के लिए नियमित अभिव्यक्ति मेरे पास एक स्ट्रिंग है जिसमें एकाधिक ब्रैकेट हैं। मान लेंएक स्ट्रिंग

s="(a(vdwvndw){}]" 

मैं सभी ब्रैकेट को एक अलग स्ट्रिंग के रूप में निकालना चाहता हूं।

>>> brackets=re.search(r"[(){}[]]+",s) 
>>> brackets.group() 

लेकिन यह सिर्फ मेरे पिछले दो कोष्ठक दे रहा है:

मैं इस कोशिश की।

'}]' 

वह क्यों है? क्या यह चरित्र सेट में किसी भी एक से अधिक ब्रैकेट नहीं लेना चाहिए?

+2

देख 're.findall' http://stackoverflow.com/questions/7724993/python-using-regex-to-find-multiple-matches -और-प्रिंट-आउट-आउट – C8H10N4O2

+0

https://regex101.com/ नियमित अभिव्यक्तियों का निर्माण और परीक्षण करने के लिए एक शानदार टूल है। – asimoneau

+0

ध्यान दें कि 're.search' केवल पहला मैच उत्पन्न करता है। – TigerhawkT3

उत्तर

7

आपको पहले समापन वाले वर्ग ब्रैकेट से बचना होगा।

r'[(){}[\]]+' 

एक स्ट्रिंग में उन सभी को संयोजित करने के लिए, आप कुछ भी खोज सकते हैं कि नहीं मैच करता है और उसे निकाल दें।

brackets = re.sub(r'[^(){}[\]]', '', s) 
3

उपयोग निम्नलिखित (वर्ग कोष्ठक होना चाहिए भाग निकलेचरित्र वर्ग अंदर बंद):

brackets=re.search(r"[(){}[\]]+",s) 
          ↑ 
+0

हाय आपकी टिप्पणी के लिए धन्यवाद। लेकिन मुझे समझ में नहीं आता कि मुझे अंतिम स्क्वायर ब्रैकेट से बचने की जरूरत क्यों है। क्या चरित्र वर्ग किसी भी चरित्र के लिए खोज नहीं करेगा और + इसे एक या अधिक बना देगा? – user

+0

@user आप सही हैं .. लेकिन regex कैसे पता चलेगा कि कौन सा स्क्वायर ब्रैकेट बंद है? आंतरिक एक? या बाहरी एक? .. यही कारण है कि आपको अंदरूनी भागने की ज़रूरत क्यों है .. आशा है कि आपको मेरा अंक मिल जाएगा .. –

+0

यूप को यह मिला।लेकिन क्यों खोज केवल एक मैच लाती है? मैं "+" का उपयोग कर रहा हूं, इसलिए इसे एक या अधिक नहीं लेना चाहिए? – user

1

नियमित अभिव्यक्ति "[(){}[]]+" (या बल्कि "[](){}[]+" या "[(){}[\]]+" (दूसरों का सुझाव दिया है के रूप में)) लगातार पात्रों का अनुक्रम पाता है। आपको इन सभी अनुक्रमों को ढूंढने और उनसे जुड़ने के लिए क्या करना है।

brackets = ''.join(re.findall(r"[](){}[]+",s)) 

यह भी ध्यान रखें कि मैं एक वर्ग में पात्रों के आदेश को पुन: व्यवस्थित, ] के रूप में एक कक्षा की शुरुआत में होने के लिए इतना है कि यह के अंत के रूप में व्याख्या का नहीं है:

एक समाधान यह है कक्षा परिभाषा।

+0

का उपयोग करना होगा' '' 'के साथ' re.sub', viz 'brackets = re .sub (आर '[^]() {} []', '', एस) '? – TigerhawkT3

+0

यह भी बेहतर है! –

+0

+1 वास्तव में वांछित आउटपुट का उत्पादन करने वाला पहला जवाब होने के लिए: पी (और बैकस्लैश से बचने के लिए)। – TigerhawkT3

1

तुम भी एक regex के बिना यह कर सकता है:

s="(a(vdwvndw){}]" 
keep = {"(",")","[","]","{","}"} 
print("".join([ch for ch in s if ch in keep])) 
((){}] 
+0

या, चूंकि यह मेरे लिए पाइथन 3 जैसा दिखता है, 'प्रिंट (* (ch में ch ch में ch ch के लिए ch), sep =' ')'। – TigerhawkT3

+0

@ टाइगरहॉक 3, हाँ, सच है लेकिन मुझे लगता है कि ओपी स्ट्रिंग का उपयोग करना चाहता है, इसलिए वास्तव में इसे एक चर के लिए असाइन किया जाएगा। –

+0

अच्छा बिंदु। मैं बस '*' का विरोध नहीं कर सकता। – TigerhawkT3