提问人:Fazli 提问时间:10/12/2021 最后编辑:ujjaldeyFazli 更新时间:10/13/2021 访问量:59
从字符串创建字典
Create dictionary from strings
问:
我想从给定的字符串创建字典。字符串很复杂。字符串可以采用以下形式:
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 中实现这一点?
答:
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))
这并不完美,但它;)
此致敬意。
下一个:基于子字符串拆分列表元素
评论
(if
if (