2012-04-15 12 views
6

में सभी तर्क मान लीजिए मैं ऐसे निम्नलिखित के रूप में एक स्ट्रिंग है मिलान करने के लिए। यह सिर्फ इस प्रारूप है। यदि यह आसान बनाता है, तो इसे फ़ंक्शन कॉल के रूप में न सोचें, केवल एक स्ट्रिंग।नियमित अभिव्यक्ति समारोह नाम और अजगर

मैं फ़ंक्शन से मेल खाने के लिए नियमित अभिव्यक्ति लिखना चाहता हूं और तर्कों के प्रत्येक को लिखना चाहता हूं। मैं इसे पायथन में लिख रहा हूं। इस के वांछित उत्पादन होता है:

{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]} 

संपादित करें: तर्क फ़ंक्शन कॉल हो सकता है, मैं आसानी से रिकर्सिवली एक बार मैं एक है कि काम करता है बनाने के एक ही नियमित अभिव्यक्ति के साथ उन्हें मैच के लिए कोशिश कर सकते हैं। इस से मेरा मतलब है कि मैं प्रत्येक तर्क के साथ समारोह पर भर्ती कर सकता हूं। लेकिन यह वास्तव में प्रासंगिक नहीं है। मैं नहीं एक दुभाषिया बनाने की कोशिश कर रहा हूं, केवल कुछ तर्कों को पहचानने के लिए।

import re 
s = "func(arg1, arg2, arg3, arg4, argn)" 
m = re.match(r"(?P<function>\w+)\s?\((?P<args>(?P<arg>\w+(,\s?)?)+)\)", s) 
print m.groupdict() 

और यहाँ आउटपुट है:

{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'} 

समारोह ठीक से मेल खाता है, और इसलिए तर्क सेट करता है

यहाँ इस पर मेरे प्रयास है। हालांकि, मैं व्यक्तिगत तर्कों से मेल नहीं खा सकता। क्या यह मेरे regex, या पायथन नियमित अभिव्यक्ति मिलान की एक सीमा के साथ एक समस्या है?

EDIT2: मैं वाकिफ हूँ कि मैं अब निम्नलिखित कोड का उपयोग कर बहस विभाजित कर सकते हैं:

d["arg"] = d["args"].split(", ") 

लेकिन अगर मैं नियमित अभिव्यक्ति के साथ पूरे काम कर सकता है मैं सोच रहा था। विशेष रूप से, मैं सोच रहा हूं कि क्यों "तर्क" केवल अंतिम तर्क से मेल खाता है।

EDIT3: मुझे लगता है कि मैं (1) यह समझने की उम्मीद कर रहा हूं कि क्यों पाइथन केवल हर बार अंतिम तर्क से मेल खाता है, और (2) क्या मैं पायथन में योजना-शैली पैटर्न-मिलान कर सकता हूं। या यदि पाइथन में स्कीम-स्टाइल पैटर्न मिलान के रूप में कुछ अंतर्ज्ञानी है। मैंने अस्थ मॉड्यूल को देखा, और इसका वाक्यविन्यास निषिद्ध जटिल है।

+1

कुछ विशेष भाषा में इस समारोह कॉल है? आप एक ऐसी भाषा है जिसके लिए एक सही/पूर्ण पार्सर पहले से मौजूद है ... – Borealid

+0

आप रेगुलर एक्सप्रेशन के साथ ऐसा नहीं कर सकते पार्स करने के लिए रेगुलर एक्सप्रेशन का उपयोग नहीं करना चाहिए (यह मानते हुए आप अलग-अलग तर्क है, जो खुद को फ़ंक्शन कॉल हो सकता है मिलान करना चाहते हैं)। आपको एक वास्तविक पार्सर चाहिए। http://pyparsing.wikispaces.com/ http://effbot.org/zone/simple-iterator-parser.htm – Wes

+0

आप बाहर [pyparsing] जांच करना चाह सकते (: आप अपने खुद के लेखन पर जोर देते हैं, तो यह पढ़) यदि आप कुछ और जटिल करने की योजना बना रहे हैं। –

उत्तर

4

ऐसा लगता है कि वहाँ 90%, क्यों सिर्फ arg और args समूहों स्वैप नहीं कर रहे हैं और कार्य करें:

import re 

fn_match = re.match(r"(?P<function>\w+)\s?\((?P<arg>(?P<args>\w+(,\s?)?)+)\)", s) 
fn_dict = fn_match.groupdict() 
del fn_dict['args'] 
fn_dict['arg'] = [arg.strip() for arg in fn_dict['arg'].split(',')] 
+0

मैं पूरी चीज़ को रेगेक्स के रूप में कैप्चर करने की कोशिश कर रहा हूं। क्या यह संभव नहीं है? – BlackSheep

+0

आप जो तर्क चाहते हैं उसकी परिणामी सूची नहीं प्राप्त करें। जब आपके पास एक संपूर्ण टूलबॉक्स होता है तो केवल एक स्विस सेना चाकू का उपयोग क्यों करें? – mVChr

7

नियमित अभिव्यक्ति जटिल प्रोग्रामिंग भाषाओं का विश्लेषण नहीं कर सकते हैं।

यदि आप सिर्फ पायथन को पार्स करने का प्रयास कर रहे हैं, तो मैं सुझाव देता हूं कि ast मॉड्यूल पर नज़र डालें, जो आपके लिए इसे पार्स करेगा।

+0

मैं पाइथन को पार्स करने की कोशिश नहीं कर रहा हूं, बस एक बहुत ही विशिष्ट वाक्यविन्यास को कैप्चर करें। मैंने जो कुछ पढ़ा है, उससे ऐसा लगता है कि अस्थ मॉड्यूल (1) पाइथन के लिए विशिष्ट है, और (2) जो मैं करने की कोशिश कर रहा हूं उसके लिए बहुत जटिल है। – BlackSheep

1

अपने प्रश्न के अंतिम भाग का उत्तर देने के: नहीं अजगर के समान लेना देना नहीं है योजना का "मैच" है, न ही इसमें एमएल/हास्केल जैसे पैटर्न मिलते हैं। निकटतम बात यह है इस तरह इस

>>> (a, [b, c, (d, e)]) = (1, [9, 4, (45, 8)]) 
>>> e 
8 

तरह बातें destructure लिए और सिर और एक सूची की पूंछ (अजगर 3.x में) निकालने की क्षमता है ...

>>> head, *tail = [1,2,3,4,5] 
>>> tail 
[2, 3, 4, 5] 

कुछ ऐसा वास्तविक हालांकि अजगर में मिलान पैटर्न के आसपास चल मॉड्यूल उपलब्ध हैं, लेकिन मैं उनकी गुणवत्ता के लिए ज़िम्मेदार नहीं हैं।

अगर मुझे ऐसा करना है, तो मैं इसे थोड़ा अलग तरीके से कार्यान्वित कर दूंगा - शायद एक प्रकार और वैकल्पिक तर्क (जैसे लंबाई, या सटीक सामग्री) इनपुट करने की क्षमता हो और यदि यह मेल खाता है तो कॉल करने की क्षमता है, जैसे मैच ([सूची, लंबाई = 3, चेक = (3, str), func]) और वह मिलान करेगा (सूची _ _ somestr) और स्कोप में somestr के साथ func कॉल करें, और आप और अधिक पैटर्न भी जोड़ सकते हैं।

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