在python中构建解析器

时间:2013-02-01 21:59:59

标签: python

我正在尝试在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)

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

   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.

现在我知道我可以在这里处理..内部Foo方法..但一般来说我想在parse_string_to_command函数中处理这些变量赋值

这是否有意义。

1 个答案:

答案 0 :(得分:1)

您可能希望使用pythons 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"