2010-05-17 4 views
7

में सीमांकक के बीच शब्दों निकाला जा रहा है नीचे स्ट्रिंग, मैं delimters [ ]'Service Current','Service','9991','1.22' तरह के बीच शब्दों निकालना चाहते हैं से:[] अजगर

str='mysrv events Generating Event Name [Service Current], Category [Service] Test [9991] Value [1.22]' 

मैं कैसे अजगर में एक ही निकाल सकते हैं?

अग्रिम क्रिस

उत्तर

18

सबसे पहले धन्यवाद, एक चर नाम के रूप में str प्रयोग से बचें। str पहले से ही पाइथन में एक अर्थ है और इसे कुछ और होने के लिए परिभाषित करके आप लोगों को भ्रमित करेंगे।

कहा करने के बाद कि आप निम्न रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

>>> import re 
>>> print re.findall(r'\[([^]]*)\]', s) 
['Service Current', 'Service', '9991', '1.22'] 

यह इस प्रकार काम करता है:

 
\[ match a literal [ 
( start a capturing group 
[^]] match anything except a closing ] 
* zero or more of the previous 
) close the capturing group 
\] match a literal ] 

एक वैकल्पिक नियमित अभिव्यक्ति है:

r'\[(.*?)\]' 

इस से काम करता हैको छोड़कर कुछ भी मिलान करने के बजाय एक गैर लालची मैच का उपयोग करना 0।

+2

+ 1 अभिव्यक्ति आसान अगर आप सिर्फ यह गैर लालची बनाने के हो जाता है: '' \\ [\\ (*।?)]। ['Re.findall()'] से लिंक करें (http://docs.python.org/library/re.html#re.findall), ['re' से लिंक] (http://docs.python.org /library/re.html) –

+0

@ फ़ेलिक्स: जोड़ा गया, धन्यवाद। –

+0

ये अभिव्यक्ति स्ट्रिंग '' [] '' से मेल खाती हैं, साथ ही '[' ']' (खाली स्ट्रिंग) लौटती हैं। यदि उनके बीच कोई वर्ण वाले स्क्वायर ब्रैकेट को अनदेखा किया जाना चाहिए, तो पहले अभिव्यक्ति में '*' को '+' में बदला जा सकता है। आईई, 'आर' \ [([^]] +) \] ''। (दिलचस्प बात यह है कि गैर-लालची अभिव्यक्ति में '*' को प्रतिस्थापित करना प्रतीत नहीं होता है।) – jpmc26

4

आप उपयोग कर सकते regex

import re 
s = re.findall('\[(.*?)\]', str) 
+0

हे मैं इसे समझने के लिए संघर्ष कर रहा हूं, मैं इस शब्द को 'शब्द', ') से निकालने के लिए कैसे संशोधित करूं ताकि बीच के बीच ('और') क्या कोई उपयोगी ट्यूटोरियल है जो आप मुझे निर्देशित कर सकते हैं –