小编典典

如何用引号将逗号分隔的键值对拆分

python

我知道关于解析逗号分隔值还有很多其他文章,但是我找不到拆分键-值对并处理引号逗号的文章。

我有这样的字符串:

age=12,name=bob,hobbies="games,reading",phrase="I'm cool!"

我想得到这个:

{
  'age': '12',
  'name': 'bob',
  'hobbies': 'games,reading',
  'phrase': "I'm cool!",
}

我试过这样使用shlex

lexer = shlex.shlex('''age=12,name=bob,hobbies="games,reading",phrase="I'm cool!"''')
lexer.whitespace_split = True
lexer.whitespace = ','
props = dict(pair.split('=', 1) for pair in lexer)

麻烦在于,shlexhobbies条目将分为两个令牌,即hobbies="gamesreading"。有没有办法使双引号考虑在内?还是我可以使用另一个模块?

编辑:固定错字 whitespace_split

编辑2:我不限于使用shlex。正则表达式也很好,但是我不知道如何处理匹配的引号。


阅读 222

收藏
2021-01-20

共1个答案

小编典典

您只需要shlex在POSIX模式下使用词法分析器即可。

posix=True创建词法分析器时添加。

(请参阅shlex解析规则

lexer = shlex.shlex('''age=12,name=bob,hobbies="games,reading",phrase="I'm cool!"''', posix=True)
lexer.whitespace_split = True
lexer.whitespace = ','
props = dict(pair.split('=', 1) for pair in lexer)

输出:

{'age': '12', 'phrase': "I'm cool!", 'hobbies': 'games,reading', 'name': 'bob'}

PS:只要输入可以包含引号=,字符,则正则表达式将无法解析键值对。即使预处理字符串,也无法使输入由正则表达式解析,因为不能将这种输入形式化地定义为正则语言。

2021-01-20