转键="值"串成一个字典

时间:2014-04-22 19:19:23

标签: python regex python-2.7 dictionary

我有一个字符串格式如下:

author="PersonsName" date="1183050420" format="1.1" version="1.2"

我想把它变成Python dict,la:

{'author': 'PersonsName', 'date': '1183050420', 'format': '1.1', 'version': '1.2'}

我试图在字符串上使用re.split来这样做:

attribs = (re.split('(=?" ?)', twikiattribs))

以为我会得到一个列表:

['author', 'PersonsName', 'date', '1183050420', 'format', '1.1', 'version', '1.2']
然后我可以变成一个词典,但我得到了:

['author', '="', 'PersonsName', '" ', 'date', '="', '1183050420', '" ', 'format', '="', '1.1', '" ', 'version', '="', '1.2', '"', '']

所以,在我进一步遵循re.split线之前,通常有更好的方法来实现我想要做的事情,和/或如果解决方案涉及re.split,我怎么能写一个正则表达式这将分裂在任何字符串=""_(其中" _"是空格字符)或仅"以产生一个包含键的列表奇数指数,以及偶数中的值?

7 个答案:

答案 0 :(得分:5)

使用re.findall()

dict(re.findall(r'(\w+)="([^"]+)"', twikiattribs))

re.findall(),当呈现具有多个捕获组的模式时,返回元组列表,每个嵌套元组包含捕获的组。 dict()愉快地获取该输出并将每个嵌套元组解释为键值对。

演示:

>>> import re
>>> twikiattribs = 'author="PersonsName" date="1183050420" format="1.1" version="1.2"'
>>> re.findall(r'(\w+)="([^"]+)"', twikiattribs)
[('author', 'PersonsName'), ('date', '1183050420'), ('format', '1.1'), ('version', '1.2')]
>>> dict(re.findall(r'(\w+)="([^"]+)"', twikiattribs))
{'date': '1183050420', 'format': '1.1', 'version': '1.2', 'author': 'PersonsName'}
基于捕获组,

re.split()的行为也不同;如果分组,则拆分的文本将包含在输出中。使用和不使用捕获组比较输出:

>>> re.split('(=?" ?)', twikiattribs)
['author', '="', 'PersonsName', '" ', 'date', '="', '1183050420', '" ', 'format', '="', '1.1', '" ', 'version', '="', '1.2', '"', '']
>>> re.split('=?" ?', twikiattribs)
['author', 'PersonsName', 'date', '1183050420', 'format', '1.1', 'version', '1.2', '']

然而,re.findall()输出更容易转换为字典。

答案 1 :(得分:3)

你也可以在一行中没有re的情况下这样做:

>>> data = '''author="PersonsName" date="1183050420" format="1.1" version="1.2"'''
>>> {k:v.strip('"') for k,v in [i.split("=",1) for i in data.split(" ")]}
{'date': '1183050420', 'format': '1.1', 'version': '1.2', 'author': 'PersonsName'}

如果允许在值内使用空格,则可以使用此行:

>>> {k:v.strip('"') for k,v in [i.split("=",1) for i in data.split('" ')]}

答案 2 :(得分:2)

我亲自解析它的方式:

import shlex

s = 'author="PersonsName" date="1183050420" format="1.1" version="1.2"'

dict(x.split('=') for x in shlex.split(s))
Out[12]: 
{'author': 'PersonsName',
 'date': '1183050420',
 'format': '1.1',
 'version': '1.2'}

答案 3 :(得分:2)

一个非正则表达式列表理解一个班轮:

>>> s = 'author="PersonsName" date="1183050420" format="1.1" version="1.2"'

>>> print dict([tuple(x.split('=')) for x in s.split()])
{'date': '"1183050420"', 'format': '"1.1"', 'version': '"1.2"', 'author': '"PersonsName"'}

答案 4 :(得分:1)

问题是你在正则表达式中包括括号,它将它变成一个捕获的组并将其包含在拆分中。像这样分配attribs

attribs = (re.split('=?" ?', twikiattribs))

它将按预期工作。这确实返回一个空白字符串(由于输入字符串中的最后"),因此您在创建字典时将需要使用attribs[:-1]

答案 5 :(得分:0)

尝试

nativeCharArray

假设前面的值没有空格。

谨防使用String^。有趣的输入可能会发生坏事。不要在用户输入上使用它。

答案 6 :(得分:0)

这可能会帮助其他人re.findall()不会。

{{1}}

它本质上做的是为输入添加变量名称并创建该变量。

例如,如果您的列表返回为" [[1,2] [list] [3,4]]"这执行为variable_name = [[1,2] [list] [3,4]]

激活它的原始功能。

它确实会产生PEP 8错误,因为变量在运行之前不存在。