【问题标题】:Python: split this length-structured string the most elegant wayPython:以最优雅的方式拆分这个长度结构的字符串
【发布时间】:2020-03-15 05:37:36
【问题描述】:

给定这个字符串:

fsw="M525x617M525x617S16d48492x577S10000505x544S22a00506x524S21300487x601S37601511x574S34500482x483

我想转换

fsw[8:] (thus "M525x617S16d48492x577S10000505x544S22a00506x524S21300487x601S37601511x574S34500482x483")

在包含以下内容的字典中:

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

我设法用正则表达式得到以下信息:

>>> 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”)吗?

提前 - 非常感谢。 问候。

【问题讨论】:

  • 键和值是固定长度的吗?
  • 是的,您总能在 fsw[8:] 中找到模式为 S[123][0-9a-f]{2}[0-5][0-9a-f] 的前 6 个字符然后是 7 个字符,例如 YYYxZZZ,其中 YYY 和 ZZZ 是数字('x' 总是在中间)。因此 13 个或更多字符,总是 13 的倍数。
  • 如果它们是固定的,那么模式并不重要,不是吗?您不需要使用正则表达式,只需遍历这些拆分点即可。请参阅@ctenar 的回答。对于第二个问题,key 应该是唯一的,value 不一定是。

标签: python regex dictionary split


【解决方案1】:

看来你可以把表情改成

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

然后像中一样进行字典理解

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 上的代码,请参见演示。

【讨论】:

    【解决方案2】:

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

    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',
     'S10000': '505x544',
     'S22a00': '506x524',
     'S21300': '487x601',
     'S37601': '511x574',
     'S34500': '482x483'}
    

    【讨论】:

      【解决方案3】:

      不确定我是否理解您要执行的操作,但从该字符串获取字典的一种方法是

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

      【讨论】:

        猜你喜欢
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 2022-01-19
        相关资源
        最近更新 更多