我知道关于解析逗号分隔值还有很多其他文章,但是我找不到拆分键-值对并处理引号逗号的文章。
我有这样的字符串:
age=12,name=bob,hobbies="games,reading",phrase="I'm cool!"
我想得到这个:
{ 'age': '12', 'name': 'bob', 'hobbies': 'games,reading', 'phrase': "I'm cool!", }
我试过这样使用shlex:
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)
麻烦在于,shlex该hobbies条目将分为两个令牌,即hobbies="games和reading"。有没有办法使双引号考虑在内?还是我可以使用另一个模块?
hobbies
hobbies="games
reading"
编辑:固定错字 whitespace_split
whitespace_split
编辑2:我不限于使用shlex。正则表达式也很好,但是我不知道如何处理匹配的引号。
您只需要shlex在POSIX模式下使用词法分析器即可。
posix=True创建词法分析器时添加。
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:只要输入可以包含引号=或,字符,则正则表达式将无法解析键值对。即使预处理字符串,也无法使输入由正则表达式解析,因为不能将这种输入形式化地定义为正则语言。
=
,