-5

2種類の機能を実現できるPythonでパーサーを作成しようとしています

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

私は2つのタイプを言います...最初のタイプは通常オブジェクトであり、2番目のタイプは変数のように親切です。さて、最初のものは簡単です。

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関数内でこれらの変数の割り当てを処理したいと思います。

それは意味がありますか?

4

1 に答える 1

1

目標を達成するために、 pythonsJSONパーサーの使用を検討することをお勧めします。

>>> 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"
于 2013-02-01T22:56:38.390 に答える