【问题标题】:Create dictionary from strings从字符串创建字典
【发布时间】:2021-12-01 04:47:19
【问题描述】:

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

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 中实现这一点?

【问题讨论】:

  • 在第二个字符串中,是(if 还是if (
  • 应该是if ( ,我会更新帖子

标签: python pandas dataframe numpy data-manipulation


【解决方案1】:

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

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

词法分析器/解析器的工作原理

词法分析器

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

这一步叫做tokenization

解析器

解析器将使用您的字符串部分(tokens)来操作一些已定义的函数。

示例

我做了这个例子:

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))

这并不完美,但它有效;)

最好的问候。

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 2016-12-02
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多