从字符串创建字典

Create dictionary from strings

提问人:Fazli 提问时间:10/12/2021 最后编辑:ujjaldeyFazli 更新时间:10/13/2021 访问量:59

问:

我想从给定的字符串创建字典。字符串很复杂。字符串可以采用以下形式:

test1 = "if rpd.col_A == 'Type A'"
test2 = "if (rpd.col_A == 'Type B') AND (rpd_dev == 'Other') AND (rpd_form == 'Other')"

生成的字典应如下所示:

test1_dict = {'rpd.col_A':'Type A'}
test2_dict = {'rpd.col_A':'Type B','rpd_dev' : 'Other', 'rpd_form' = 'Other'}

如何在 python 中实现这一点?

Python Pandas DataFrame numpy 数据操作

评论

0赞 Quang Hoang 10/12/2021
在第 2 个字符串中,是 还是 ?(if if (
0赞 Fazli 10/12/2021
应该是如果( ,我会更新帖子

答:

0赞 Félix Herbinet 10/13/2021 #1

为了回答你的主题,我建议你使用一个包含词法分析器和解析器的包,因为你的字符串似乎有不同类型的格式。

这是一个非常“易于使用”的:狡猾

Lexer/Parser 的工作原理

词法分析器

基本上,这会将您的字符串拆分为与特定模式(通常是正则表达式)匹配的几个单词(或表达式)。

此步骤称为 。tokenization

解析 器

解析器将使用您的字符串部分(标记)在其上操作一些定义的函数。

我举了这个例子:

from sly import Lexer, Parser


class MyLexer(Lexer):
    tokens = {KEY, PARAM, AND, EQUAL, LPAREN, RPAREN, IF_STATEMENT}
    ignore = ' \t\n'

    IF_STATEMENT = r'if'
    AND = r'AND'
    KEY = r'[a-zA-Z_][a-zA-Z0-9_.]*'
    PARAM = r"'[a-zA-Z0-9_. ]*'"
    EQUAL = r'='
    LPAREN = r'\('
    RPAREN = r'\)'

    def PARAM(self, token):
        token.value = token.value.replace("'", '')
        return token

    def error(self, t):
        print("Illegal character '%s'" % t.value[0])
        self.index += 1


class MyParser(Parser):
    tokens = MyLexer.tokens

    @_('term')
    def statement(self, p):
        return p.term

    @_('IF_STATEMENT term')
    def term(self, p):
        return p.term
    
    @_('term AND term')
    def term(self, p):
        return {**p.term0, **p.term1}
    
    @_('LPAREN term RPAREN')
    def term(self, p):
        return p.term

    @_('KEY EQUAL expr')
    def term(self, p):
        return {str(p.KEY): p.expr}

    @_('PARAM')
    def expr(self, p):
        return p.PARAM

if __name__ == '__main__':
    lexer = MyLexer()
    parser = MyParser()
    tokenizer = lexer.tokenize(input('Input string > '))
    print(parser.parse(tokenizer))

这并不完美,但它;)

此致敬意。