Python:以最优雅的方式拆分此长度结构化的字符串

给出以下字符串:

fsw="M525x617M525x617S16d48492x577S10000505x544S22a00506x524S21300487x601S37601511x574S34500482x483

我想转换

fsw[8:] (thus "M525x617S16d48492x577S10000505x544S22a00506x524S21300487x601S37601511x574S34500482x483")

在包含以下内容的字典中

{'S16d48':'492x577','S10000':'505x544','S22a00':'506x524','S21300':'487x601','S37601':'511x574','S34500':'482x483'}

我设法通过regexp获得了以下内容:

>>> import re
>>> re.findall("S[123][0-9a-f]{2}[0-5][0-9a-f]",fsw[8:])
['S16d48','S10000','S22a00','S21300','S37601','S34500']

>>> re.findall("S[123][0-9a-f]{2}[0-5][0-9a-f].......",fsw[8:])
['S16d48492x577','S10000505x544','S22a00506x524','S21300487x601','S37601511x574','S34500482x483']

但是就字典而言...我无法再进一步了。

  

另一个问题:在Python字典中,整体而言   键值对(例如“ S16d48”:“ 492x577”)必须是唯一的对吗?

提前-非常感谢。 问候。

capt_feng 回答:Python:以最优雅的方式拆分此长度结构化的字符串

似乎您可以将表情更改为

(?P<key>S[123][0-9a-f]{2}[0-5][0-9a-f])
(?P<value>\d+x\d+)

然后像

那样进行dict理解
import re
rx = re.compile(r'(?P<key>S[123][0-9a-f]{2}[0-5][0-9a-f])(?P<value>\d+x\d+)')

data = "M525x617M525x617S16d48492x577S10000505x544S22a00506x524S21300487x601S37601511x574S34500482x483"

result = {m["key"]: m["value"] for m in rx.finditer(data)}

这产生

{'S16d48': '492x577','S10000': '505x544','S22a00': '506x524','S21300': '487x601','S37601': '511x574','S34500': '482x483'}


有关表达式on regex101.comideone.com上的代码,请参见演示。

,

您可以通过以下方式将已创建的列表转换为字典:

import re

fsw="M525x617M525x617S16d48492x577S10000505x544S22a00506x524S21300487x601S37601511x574S34500482x483"
str_lst = re.findall("S[123][0-9a-f]{2}[0-5][0-9a-f]",fsw[8:])
full_lst = re.findall("S[123][0-9a-f]{2}[0-5][0-9a-f].......",fsw[8:])
str_dict = {x: y[len(x):] for x in str_lst for y in full_lst if y.startswith(x)}

这给出了:

{'S16d48': '492x577','S34500': '482x483'}
,

不确定我是否了解您要做什么,但是从该字符串获取字典的一种方法是

d = {}
for piece in fsw[8:].split('S')[1:]:
    d["S"+piece[:5]] = piece[5:]

print(d)
本文链接:https://www.f2er.com/3071893.html

大家都在问