我正在尝试从我的示例字符串中创建一个字典,但我得到的样本源非常脏
我的工作python代码片段:
dict(item.split(':', 1) for item in re.sub(' ', '', re.sub('"', '', ','.join(
list(filter(None, re.sub('\r', '', text_subsection.split('text')[1]).split('\n')))))).split(',')
)
text_subsection 中的内容示例如下:
\r\n; Count of Something: 3\r\ntext\r\n"Key1: 9999999, Key2: mnkhkljh213, Key3: 593, Key4: 66666"\r\n"Key5 something: sample, Desc: , Date: 4/28/2025, Time: 4:15 PM"\r\n"ANOTHERKEY: 622523, KEY1: 9999999, KEY6: 160305, KEY7: 0, KEY8: 10, KEY11: 1, DATE: 4/28/2025, TIME: 16:15:50"\r\n
笔记:
是的,key1 的形式为“Key1”和“KEY1”
是的,日期以“Date”和“DATE”的形式出现
是的,时间以“时间”和“时间”以及多个“:”的形式出现
是的,key5 名称中有一个空格
我同意稍后使用这个字典的逻辑中这些关键的重复
您可以合并两个外部的
re.sub
,删除list
并将内部的re.sub
与合并split
:re.sub(' |"', '', ...)
删除所有空格和双引号。join
需要一个可迭代对象。它不一定是列表。如果
\n
总是带有\r
,则删除\r
并按 拆分\n
与按 拆分相同\r\n
。我不确定您是否觉得这更干净(我碰巧这么认为)因为这有点主观,但这似乎给了您想要的结果。
为您提供:
如果您确实想删除键中的空格,您可以执行以下操作:
鉴于您在评论中提到的减少对正则表达式的依赖,我在 regex101 中尝试了一下您的示例字符串。我认为您只需要这个:
([A-Za-z0-9 ]+?):\s*([^,\r\n"]+)
。匹配 n 是键和值的字符串。对于匹配 n,组 1 是键,组 2 是值。需要注意的是,你对某些事情的处理方式留下了一些模糊性。
\r\ntext\r\n
大概不是计数的一部分(不是数字),也不是键。它自成一行。这就是为什么我使用modified_text
,因为我假设如果事物自成一行,那么如果没有合并,它们就会被预先擦除。因此你可以使用: