Python解析包含函数,列表和dicts的字符串

时间:2016-09-17 12:54:50

标签: python regex string-parsing

我正在尝试找到解析字符串的方法,该字符串可以包含用“,”分隔的python语法编写的变量,函数,列表或dict。空格应该可以在任何地方使用,因此当它不在(),[]或{}之内时,用“,”分开。

示例字符串:select building.bno, building.bname, count(distinct rno) from room natural join building where maxstud = 1 group by 1,2 -- I used positions here, you can use names if you wish having count(distinct rno) >= 10

另一个示例字符串:"variable, function1(1,3), function2([1,3],2), ['list_item_1','list_item_2'],{'dict_key_1': "dict_item_1"}"

示例输出"variable,function1(1, 3) , function2( [1,3],2), ['list_item_1','list_item_2'],{'dict_key_1': "dict_item_1"}"

编辑: 代码的原因是解析字符串a然后用["variable", "function1(1,3)", "function2([1,3],2)", "['list_item_1','list_item_2']", "{'dict_key_1': "dict_item_1"}"]运行它。 (是的,我知道这可能不是推荐的做事方式)

3 个答案:

答案 0 :(得分:2)

我想这里的主要问题是数组和dicts中也有逗号,所以只使用str.split(",")不起作用。一种方法是一次解析一个字符串,并跟踪所有括号是否都关闭。如果是,我们可以在遇到逗号时将当前结果附加到数组中。这是我的尝试:

s = "variable, function1(1,3),function2([1,3],2),['list_item_1','list_item_2'],{'dict_key_1': 'dict_item_1'}"

tokens = []
current = ""
open_brackets = 0

for char in s:
    current += char

    if char in "({[":
        open_brackets += 1
    elif char in ")}]":
        open_brackets -= 1
    elif (char == ",") and (open_brackets == 0):
        tokens.append(current[:-1].strip())
        current = ""

tokens.append(current)

for t in tokens:
    print(t)

"""
    variable
    function1(1,3)
    function2([1,3],2)
    ['list_item_1','list_item_2']
    {'dict_key_1': 'dict_item_1'}
"""

答案 1 :(得分:0)

您是否尝试过使用拆分?

>>> teststring = "variable, function1(1,3), function2([1,3],2), ['list_item_1','list_item_2'],{'dict_key_1': 'dict_item_1'}"
>>> teststring.split(", ")
['variable', 'function1(1,3)', 'function2([1,3],2)', "['list_item_1','list_item_2'],{'dict_key_1': 'dict_item_1'}"]

答案 2 :(得分:0)

正则表达式不是非常适合解析任意代码的复杂性。你到底想要完成什么?您可以(不安全地)使用eval来仅将字符串作为代码进行评估。或者,如果您在没有Pods的情况下尝试理解它,则可以使用the astdis modules进行各种形式的检查。