2013-02-01 7 views
-5

Я пытаюсь сделать парсер питон, который может достигать двух типов функциональныхпостроения синтаксического анализатора в питона

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 

EDIT 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. 

Теперь я знаю, что я могу просто справиться с этим here..inside Foo ... но в целом я хочу обрабатывать эти переменные назначения внутри функции parse_string_to_command

Это имеет смысл.

+1

Clever не всегда означает лучше. –

+0

@WaleedKhan: Так какой лучший способ прочно справиться с этим? – Fraz

+1

@WaleedKhan Просто уточнить: в программировании умный более или менее никогда не означает лучший :) Это более или менее противоположность читаемости – keyser

ответ

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" 
Смежные вопросы