2013-02-01 63 views
-5

我试图让Python中的解析器可以实现两种功能建设蟒蛇

s1 = foo() 
s2 = {'k1':v1,'k2':v2} 
s3 = [v1,v2,v3...] 

我说两种类型的分析器...其中第一种类型通常对象和第二类型是那种关闭像变量。 现在,第一个是容易..

def parse_string_to_command(string): 
    if "foo" in string: 
     #handle this. 
    elif # handle s2 
    elif #condition to handle s3 

编辑1: 我觉得我没有明确表示什么,我想才达到。

所有我试图做的是如下:从该函数传递

一切是一个字符串..有些方法..而另一些变量。 我只是试图相应地处理它们。

基本上这是什么样的用户会做

> params = {"input":"foobar"} 
> foo = Foo(params) 

现在,处理方法富..我这样做:

if "Foo" in string: 
     tokens = string.split("=") 
     # I have tokens [foo,Foo(params)] 

    But params is a string now..whereas it is needed to be a dictionary. 

现在我知道我可以处理它here..inside Foo方法..但通常我想处理parse_string_to_command函数中的这些变量赋值功能

它是否有任何意义。

+1

聪明并不总是意味着最好的。 –

+0

@WaleedKhan:那么强大处理这个问题的最好方法是什么? – Fraz

+1

@WaleedKhan只是为了澄清:在编程中,聪明或多或少不会意味着最好:)它或多或少与可读性相反 – keyser

回答

1

您可能想使用蟒蛇JSON解析器来完成您的目标。

>>> import json 
>>> a = json.loads('["foo", {"bar": ["baz", null, 1.0, 2]}]') 
>>> a 
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}] 
>>> a[0] 
u'foo' 
>>> a[1] 
{u'bar': [u'baz', None, 1.0, 2]} 
>>> a[1]['bar'] 
[u'baz', None, 1.0, 2] 
>>>>>> a[1]['bar'][0] 
u'baz' 

,或者如果你需要它的完全自定义...用了打算为你写一个完整的解析器,我想使用一些正则表达式将有助于使你的工作更容易。

>>> import re 
>>> s1 = "foo()" 
>>> s2 = "{'k1':v1,'k2':v2}" 
>>> s3 = "[v1,v2,v3]" 
>>> re.match('(.*?)\(\)',s1).group(1) 
'foo' 
>>> re.findall('\{*(.*?):(.*?)[,\}$]+',s2) 
[("'k1'", 'v1'), ("'k2'", 'v2')] 
>>> re.findall('\[*(.*?)[,\]$]+',s3) 
['v1', 'v2', 'v3'] 

为了仅仅需要确认输入的字符串的3种类型:

def parse_string_to_command(s): 
    if re.match('(.*?\(\))',s): 
     print "This is a function" 
    elif re.match('^\{.*\}$',s): 
     print "This is kind of like variables 1" 
    elif re.match('^\[.*\]$',s): 
     print "This is kind of like variables 2"