我有一个字符串格式如下:
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,我怎么能写一个正则表达式这将分裂在任何字符串="
,"_
(其中" _"是空格字符)或仅"
以产生一个包含键的列表奇数指数,以及偶数中的值?
答案 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错误,因为变量在运行之前不存在。