2011-12-20 15 views
16

में कोष्ठक में स्ट्रिंग जाओ मैं एक नमूना स्ट्रिंग <alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card] ...>, created=1324336085, description='Customer for My Test App', livemode=False>अजगर

मैं केवल मूल्य चाहते हैं cus_Y4o9qMEZAugtnW और नहीं card

(जो एक और [] अंदर है) मैं में सबसे आसान संभव तरीके से यह कर सकता है कैसे अजगर? शायद RegEx (जो मैं अच्छा नहीं हूं) का उपयोग कर?

उत्तर

40

कैसे के बारे में:

import re 

s = "alpha.Customer[cus_Y4o9qMEZAugtnW] ..." 
m = re.search(r"\[([A-Za-z0-9_]+)\]", s) 
print m.group(1) 

मेरे लिए इस प्रिंट:

cus_Y4o9qMEZAugtnW 

ध्यान दें कि re.search(...) करने के लिए कॉल पहला मैच पाता है नियमित अभिव्यक्ति के लिए, तो यह [card] नहीं मिलता है जब तक आप दूसरी बार खोज दोहराते हैं।

संपादित करें: यहाँ regular expression एक अजगर raw string literal, जो मूल रूप से इसका मतलब है बैकस्लैश विशेष वर्ण के रूप में व्यवहार नहीं कर रहे हैं और re.search() विधि अपरिवर्तित के माध्यम से पारित कर रहे हैं। नियमित अभिव्यक्ति की parts हैं:

  1. \[ एक शाब्दिक [ चरित्र
  2. ( एक नए समूह
  3. [A-Za-z0-9_] एक ऐसा किरदार कोई पत्र (पूंजी या लोअर केस), अंकों या
  4. को रेखांकित मिलान सेट शुरू होता है से मेल खाता है
  5. + पिछले तत्व (चरित्र सेट) से एक या अधिक बार मेल खाता है।
  6. ) समूह
  7. \] एक शाब्दिक ] अक्षर से मेल खाता समाप्त होता है

संपादित करें: \w के बाद से

m = re.search(r"\[(\w+)\]", s) 

: डीके के रूप में बताया गया है, रेगुलर एक्सप्रेशन में सरल किया जा सकता है एक विशेष अनुक्रम है जिसका अर्थ है [a-zA-Z0-9_]re.LOCALE पर निर्भर करता है nd re.UNICODE सेटिंग्स।

+1

क्या आप कृपया अपने उत्तर regex भाग को समझा सकते हैं, ताकि मुझे समान प्रकार की समस्याओं के लिए फिर से पूछना पड़े। धन्यवाद। – user993563

+0

मैंने नियमित उत्तर अभिव्यक्ति दस्तावेज के नियमित अभिव्यक्ति और लिंक के स्पष्टीकरण के साथ अपना उत्तर संपादित किया है। – srgerg

+5

'[ए-ज़ा-जे 0-9_]' 'w \ 'के साथ क्यों न बदलें? –

8

आप ऐसा करने के लिए str.split का उपयोग कर सकते हैं।

s = "<alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card]\ 
...>, created=1324336085, description='Customer for My Test App',\ 
livemode=False>" 
val = s.split('[', 1)[1].split(']')[0] 

तब हमने:

>>> val 
'cus_Y4o9qMEZAugtnW' 
+0

हाँ, यह गंदा कितना तार कर रहे हैं पर निर्भर करता है, लेकिन एक विभाजन अभ्यस्त हालांकि यह भी यहाँ काम कर सकता था .. – redShadow

+0

बहुत अधिक प्रभाव पड़ता है, लेकिन रेगेक्स/विभाजन का उपयोग करने वाले दोनों में से कौन सा अधिक कुशल है। क्या आप कृपया अपने विभाजन भाग को समझा सकते हैं। धन्यवाद। – user993563

+0

@ user993563 उदाहरण के उत्तर में 'str.split' के लिंक पर एक नज़र डालें। संक्षेप में, समाधान में पहला 'विभाजन' लंबाई की एक सूची देता है; पहला तत्व पहले '[' से पहले सबस्ट्रिंग है, दूसरा दूसरा '] के बाद सबस्ट्रिंग है। प्रदर्शन के लिए, आपको यह पता लगाने के लिए मापना चाहिए ([timeit'] (http://docs.python.org/library/timeit.html) देखें)। यदि आप कार्यक्रम के एक भाग में कई बार मूल्य निष्कर्षण करने की योजना बनाते हैं और नियमित अभिव्यक्तियों का उपयोग करने का निर्णय लेते हैं, तो आप [compile'] (http://docs.python.org/library/re.html#re .compile) regex। –

6

यह काम करना चाहिए:

re.match(r"[^[]*\[([^]]*)\]", yourstring).groups()[0] 
+0

मुझे लगता है कि यह ओपी से अधिक था क्योंकि उसके मामले को केवल अल्फान्यूमेरिक्स की आवश्यकता थी, लेकिन यह मेरे लिए चाल थी। धन्यवाद! – extarbags

0

तुम भी

re.findall(r"\[([A-Za-z0-9_]+)\]", string) 

उपयोग कर सकते हैं, अगर वहाँ कई घटनाओं है कि आप प्राप्त करना चाहते हैं कर रहे हैं।

अधिक जानकारी के लिए यह भी देखें: How can I find all matches to a regular expression in Python?