2012-12-27 10 views
7

मैं एक वर्ग बना रहा हूं जो उपयोगकर्ता द्वारा निर्दिष्ट प्रारूप का उपयोग कर फ़ाइल का नाम बदलता है। यह प्रारूप एक साधारण स्ट्रिंग होगी जिसका str.format विधि रिक्त स्थान भरने के लिए बुलाया जाएगा।मैं regex का उपयोग कर एक पायथन स्ट्रिंग में str.format के लिए सभी प्लेसहोल्डर कैसे ढूंढ सकता हूं?

यह पता चला है कि मेरी प्रक्रिया को ब्रेसिज़ में निहित चर नामों को निकालने की आवश्यकता होगी। उदाहरण के लिए, एक स्ट्रिंग में {user} हो सकता है, जो user उत्पन्न करना चाहिए। बेशक, एक स्ट्रिंग में ब्रेसिज़ के कई सेट होंगे, और मुझे प्रत्येक की सामग्री प्राप्त करने की आवश्यकता होगी, जिसमें वे प्रकट होते हैं और उन्हें एक सूची में आउटपुट करते हैं।

इस प्रकार, "{foo}{bar}"['foo', 'bar'] उत्पन्न करना चाहिए।

मुझे संदेह है कि ऐसा करने का सबसे आसान तरीका re.split का उपयोग करना है, लेकिन मुझे नियमित अभिव्यक्तियों के बारे में कुछ भी नहीं पता है। क्या कोई मेरी मदद कर सकता है?

अग्रिम धन्यवाद!

+0

यदि आप सभी संभावित चर * पहले से * जानते हैं, तो आप बस टी पास कर सकते हैं हेम 'str.format' के लिए सभी - यह उन लोगों को अनदेखा कर देगा जो पैटर्न में नहीं हैं। ''{user} _ {bar}' प्रारूप (उपयोगकर्ता = 'माइक', foo = 1, bar = 2)' आउटपुट 'माइक_2' होगा। मुझे खुशी है कि एक ताना में तय किए गए युद्धों को अनुमति दी गई है, इसलिए मैं पैटर्न में वर्रों की तलाश छोड़ सकता हूं। वैसे भी 'string.Formatter()' के बारे में जानना उपयोगी है। – yentsun

उत्तर

12

का उपयोग re.findall():

In [5]: import re 

In [8]: strs = "{foo} spam eggs {bar}" 

In [9]: re.findall(r"{(\w+)}", strs) 
Out[9]: ['foo', 'bar'] 
+0

बस एक त्वरित सवाल है। क्या 're.findall' के परिणाम उसी क्रम में सूचीबद्ध होने की गारंटी देते हैं जैसे वे स्ट्रिंग में दिखाई देते हैं? – blz

+1

@blz हां, क्योंकि स्ट्रिंग को बाएं से दाएं पार्स किया गया है। –

37

एक और संभावना है आप के लिए फ़ील्ड नाम निकालने के लिए अजगर की वास्तविक Formatter ही उपयोग करने के लिए है:

>>> import string 
>>> s = "{foo} spam eggs {bar}" 
>>> string.Formatter().parse(s) 
<formatteriterator object at 0x101d17b98> 
>>> list(string.Formatter().parse(s)) 
[('', 'foo', '', None), (' spam eggs ', 'bar', '', None)] 
>>> field_names = [name for text, name, spec, conv in string.Formatter().parse(s)] 
>>> field_names 
['foo', 'bar'] 

या (कम लेकिन कम जानकारीपूर्ण):

>>> field_names = [v[1] for v in string.Formatter().parse(s)] 
>>> field_names 
['foo', 'bar'] 
+0

oooooh ... मुझे यह पसंद है! मैं शायद अश्विनी चौधरी के जवाब को स्वीकार करूंगा क्योंकि मैंने विशेष रूप से रेगेक्स समाधान के लिए कहा था, लेकिन मुझे लगता है कि मैं तुम्हारा उपयोग करूंगा क्योंकि मैं इसे थोड़ा बेहतर समझता हूं! धन्यवाद! – blz

संबंधित मुद्दे

 संबंधित मुद्दे