次の点を考慮してください。
import re
sequence = 'FFFFFF{7}FFFFFF'
patterns = [ ('([0-9a-fA-F]+)', 'Sequence'),
('(\\([0-9a-fA-F]+\\|[0-9a-fA-F]+\\))', 'Option'),
('({[0-9a-fA-F]+})', 'Range'),
('(\\[[0-9a-fA-F]+:([0-9a-fA-F]+|\*)\\])', 'Slice'),
('(\\?\\?)+', 'Byte_value_Wildcard'),
('(\\*)+', 'Byte_length_wildcard') ]
fragment_counter = 0
fragment_dict= {}
fragments_list = []
while sequence:
found = False
for pattern, name in patterns:
m = re.match (pattern,sequence)
if m:
fragment_counter+=1
m = m.groups () [0]
fragment_dict["index"]=fragment_counter
fragment_dict["fragment_type"]=name
fragment_dict["value"]=m
print fragment_dict
fragments_list.append(fragment_dict)
sequence = sequence [len (m):]
found = True
break
if not found: raise Exception ('Unrecognized sequence')
print fragments_list
「print fragment_dict」行に到達するたびに、正しい(期待される)出力が得られます。
{'index': 1, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}
{'index': 2, 'fragment_type': 'Range', 'value': '{7}'}
{'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}
ただし、リスト項目 fragments_list
は、期待どおりの各行ではなく、最終的な dict の 3 つのコピーです。
[{'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}, {'index': 3, 'fragment_type': 'Sequence', 'value': 'FFFFFF'}]
これはappend
、辞書の各反復をコピーするのではなく、辞書のインスタンスを参照しているためだと思います。関数を使用して見ましlist()
たが、辞書アイテムでは、辞書キーのリストが表示されます。
私は何を間違っていますか?
私はデータ型に執着していません。見つけたフラグメントごとに 3 つのデータ要素 (そしておそらく 4 つ目) を保持する方法が必要でした。