2016-05-26 3 views
0

私が必要なスペースで区切られた形式のキー=値の値を持つ文字列、すなわちpython辞書で順序付けされていないアイテムをregex storeに置いてfindallしますか?

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

を有する正規表現を使用して辞書にこれらの値を格納することです。これまでのところ、私はこれをやった:

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

問題は、印刷は、彼らが文字列で表示されているのと同じ順序で項目を印刷していないということです。 pythonのデバッグに関する知識が不足しているため、辞書にランダムな順序で値を格納するfindall()かprint()かどうかはわかりません。私が必要とするのは、文字列に表示されているように、アイテムを順番に格納する方法です。どんな提案もありがとうございます。ありがとうございます。

+0

** [re.findall](https://docs.python.org/2/library/re.html#re.findall)** – rock321987

+1

理由:単純にre.findallの戻り値を使用: - http://stackoverflow.com/questions/15479928/why-is-the-order-in-python-dictionaries-and-sets-任意の – rock321987

+1

また、http://stackoverflow.com/questions/9848034/is-代わりに、代わりに復帰辞書を返すようになっています。代わりに、http://stackoverflow.com/questions/25628973/capturing-named-groups-in-regex-with-再発見する –

答えて

0

これはあなたの言い回しの不一致を紹介しています。 Re.findallは、一致した順にリストを返します。パターンに2つのグループがあるので、リスト内の各エントリを使用しているパターン自体が2つの値のリスト(タプル)です。

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') 
+0

そうです。どうもありがとうございました。私は4日以来、Pythonを使用しています。私はあなたに尋ねてもいいでしょう、このタプルのリストは重複を許していますか? ( 'a'、 '1')、( 'z'、 '234')、( 'h'、 '5' )]。文字列内のいくつかの値が重複しているからです(基本的には重複フィールドを持つパケットです)。 –

+0

はい、リストに重複があってもかまいません。 – barny

0
>>> 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'> 
>>> 
関連する問題