【问题标题】:does findall by regex store unordered items in python dictionary? [duplicate]findall by regex 是否在 python 字典中存储无序项? [复制]
【发布时间】:2016-09-24 01:58:17
【问题描述】:

我有一个字符串,其值为 key=value 形式,以空格分隔,即

my_string = "a=1 b=10 z=234 h=5"

我需要的是使用正则表达式并将这些值存储在字典中;到目前为止,我已经这样做了:

my_dict = dict(re.findall(r'(\S+)=(".*?"|\S+)', my_string))
print(my_dict)

问题在于 print 不会按照它们在字符串中出现的顺序打印项目。所以,由于我缺乏python调试知识,我不知道是以随机顺序在我的字典中存储值的findall()还是print()。我需要的是一种按顺序存储项目的方法,就像它们在字符串中出现的那样......也许循环通过它。任何建议将不胜感激,非常感谢您

【问题讨论】:

标签: python regex dictionary


【解决方案1】:

是你的 dict 引入了无序性。 Re.findall 按匹配顺序返回一个列表。对于您使用的模式,列表中的每个条目本身就是一个包含两个值的列表(嗯,一个元组),因为您在模式中有两个组。只需使用 re.findall 的返回值即可:

import re
my_string = "a=1 b=10 z=234 h=5"
matches = re.findall(r'(\S+)=(".*?"|\S+)', my_string)
print matches
for match in matches:
    print match

[('a', '1'), ('b', '10'), ('z', '234'), ('h', '5')]
('a', '1')
('b', '10')
('z', '234')
('h', '5')

【讨论】:

  • 就是这样。非常感谢您。我使用 python 已经 4 天了,这对我来说是全新的。请问,这个元组列表允许重复吗?即[('a', '1'), ('b', '10'), ('a', '1'), ('z', '234'), ('h', '5' )]。因为字符串中的某些值是重复的(基本上它是一个带有冗余字段的数据包)。
  • 是的,一个列表可以有重复。
【解决方案2】:
>>> my_string
'a=1 b=10 z=234 h=5'
>>> import re
>>> "{"+re.sub(r'(\w+)=', r"'\1':", re.sub(r'\s+', ',', my_string))+"}"
"{'a':1,'b':10,'z':234,'h':5}"
>>> import ast
>>> ast.literal_eval("{"+re.sub(r'(\w+)=', r"'\1':", re.sub(r'\s+', ',', my_string))+"}")
{'a': 1, 'b': 10, 'h': 5, 'z': 234}
>>> type(ast.literal_eval("{"+re.sub(r'(\w+)=', r"'\1':", re.sub(r'\s+', ',', my_string))+"}"))
<class 'dict'>
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多