用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 个回答
1
你可以考虑使用Python的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']
为了识别这三种类型的输入字符串:
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"