2012-10-23 15 views
8

से चाबियाँ प्राप्त करें मैं एक प्रतिस्थापन में एक स्ट्रिंग टेम्पलेट का उपयोग कर सकते हैं सभी संभावित कीवर्ड तर्कों की एक सूची प्राप्त करना चाहता हूं।टेम्पलेट

क्या यह फिर से करने के लिए कोई तरीका है?

मैं इस तरह कुछ करना चाहता हूँ:

text="$one is a $lonely $number." 
keys = get_keys(text) 
# keys = ('one', 'lonely', 'number') 

मैं एक साधारण पागल-लिब की तरह कार्यक्रम लिख रहा हूँ, और मैं या तो string.format या Template strings के साथ टेम्पलेट प्रतिस्थापन प्रदर्शन करने के लिए चाहते हैं। मैं 'कहानी' लिखना चाहता हूं और मेरा प्रोग्राम सभी 'कीवर्ड' (संज्ञाएं, क्रियाएं इत्यादि) की टेम्पलेट फ़ाइल तैयार करता है जिसे उपयोगकर्ता को उत्पादन करने की आवश्यकता होगी। मुझे पता है कि मैं नियमित अभिव्यक्तियों के साथ ऐसा कर सकता हूं, लेकिन मैं सोच रहा था कि कोई वैकल्पिक समाधान है या नहीं? मैं string.format और स्ट्रिंग टेम्पलेट के विकल्पों के लिए खुला हूं।

मैंने सोचा कि इसका समाधान होगा, लेकिन मैं इसे त्वरित खोज में नहीं आया हूं। मुझे यह प्रश्न मिला, reverse template with python, लेकिन यह वास्तव में नहीं है कि मैं क्या देख रहा हूं। यह सिर्फ पुष्टि करता है कि यह re के साथ किया जा सकता है।

संपादित करें:

मैं नोट करना चाहिए कि $$ '$' को पलायन है, और एक टोकन मैं चाहता हूँ नहीं है। $$5 को "$ 5" में प्रस्तुत करना चाहिए।

उत्तर

17

यदि यह string.format उपयोग करने के लिए ठीक है, का उपयोग कर निर्मित वर्ग string.Formatter जो एक parse() विधि है पर विचार करें।

+0

बहुत ज्यादा जो मैं खोज रहा था। शायद मेरे प्रश्न को काम की ज़रूरत है लेकिन मैं मूल रूप से पहिया को फिर से शुरू नहीं करना चाहता था। धन्यवाद। – Yann

+0

स्ट्रिंग एक कुंजी के साथ शुरू होने पर यह काम नहीं करता है। उपरोक्त कोशिश करें '{foo} test' – syntacticmarmalade

+0

@syntacticmarmalade मेरे लिए पाइथन 3.6 पर ठीक काम करता है। यदि आपका मतलब है कि सूची में अंत में 'कोई नहीं' है, तो ऐसा इसलिए है क्योंकि स्ट्रिंग एक कुंजी के साथ * समाप्त नहीं होती है। आप केवल 'कोई नहीं' के उदाहरण फ़िल्टर कर सकते हैं। –

1

str.split() के साथ str.strip() कोशिश:

In [54]: import string 

In [55]: text="$one is a $lonely $number." 

In [56]: [x.strip(string.punctuation) for x in text.split() if x.startswith("$")] 
Out[56]: ['one', 'lonely', 'number'] 
+0

** $ ** है ** string.punctuation का हिस्सा **, बनाने ** lstrip (' $ ') ** अनावश्यक – volcano

+0

@ वोल्कोनो बस चेक किया गया, आप सही हैं। –

0

आप की कोशिश कर सकते:

def get_keys(s): 
    tokens = filter(lambda x: x[0] == "$", s.split()) 
    return map(lambda x: x[1:], tokens) 
1

आप नियमित अभिव्यक्ति से बचने के लिए क्यों चाहते हो? वे इस बात के लिए काफी अच्छी तरह से काम करते हैं:

>>> re.findall(r'\$[a-z]+', "$one is a $lonely $number.") 
['$one', '$lonely', '$number'] 

templating के लिए, re.sub की जाँच, यह लगभग बात आप चाहते हैं करने के लिए कॉलबैक के साथ कहा जा सकता है।

>>> from string import Formatter 
>>> [i[1] for i in Formatter().parse('Hello {1} {foo}')] 
['1', 'foo'] 

अधिक जानकारी के लिए here देखें:

+0

मैं नियमित अभिव्यक्ति से बचना नहीं चाहता, मैं बस सोच रहा था कि कोई और तरीका है या नहीं। – Yann

+0

ठीक है, अगर आप एक लंबी गर्दन के साथ एक अफ्रीकी जानवर चाहते हैं, तो मगरमच्छ को फैलाना निश्चित रूप से संभव है, लेकिन ज्यादातर मामलों में एक जिराफ के साथ जाना आसान है। – che

0
>>> import string 
>>> get_keys = lambda s:[el.strip(string.punctuation) 
         for el in s.split()if el.startswith('$')] 
>>> get_keys("$one is a $lonely $number.") 
['one', 'lonely', 'number'] 
1

आप एक बार एक वाद्य यंत्र के साथ इसे प्रस्तुत कर सकते हैं जो कॉल रिकॉर्ड करता है, या डिफॉल्टडिक्ट होता है, और तब जांचता है कि उसने क्या पूछा है।

from collections import defaultdict 
d = defaultdict("bogus") 
text%d 
keys = d.keys() 
5

string.Template वर्ग पैटर्न है कि एक विशेषता के रूप में उपयोग करता है। तुम्हें पता है, मेल खाने वाले समूह

>>> print string.Template.pattern.pattern 

    \$(?: 
     (?P<escaped>\$) | # Escape sequence of two delimiters 
     (?P<named>[_a-z][_a-z0-9]*)  | # delimiter and a Python identifier 
     {(?P<braced>[_a-z][_a-z0-9]*)} | # delimiter and a braced identifier 
     (?P<invalid>)    # Other ill-formed delimiter exprs 
    ) 

और अपने उदाहरण के लिए प्राप्त करने के लिए पैटर्न मुद्रित कर सकते हैं

>>> string.Template.pattern.findall("$one is a $lonely $number.") 
[('', 'one', '', ''), ('', 'lonely', '', ''), ('', 'number', '', '')]