Во-первых, ваше регулярное выражение, похоже, не работает должным образом. Поле Key
должно иметь значения, которые могут включать f
, верно? Таким образом, его группа должна быть не ([0-9A-Ea-e]+)
, а вместо ([0-9A-Fa-f]+)
. Кроме того, это хорошая - на самом деле, замечательная - практика приставлять строку регулярного выражения к r
при работе с регулярными выражениями, потому что это позволяет избежать проблем с \
экранированием символов. (Если вы не понимаете, зачем это делать, посмотрите на необработанные строки )
Теперь мой подход к проблеме. Во-первых, я бы создал регулярное выражение без труб:
>>> regex = r"(Key):[\s]*([0-9A-Fa-f]+)[\s]*" \
... r"(Index):[\s]*([0-9]+)[\s]*" \
... r"(Field 1):[\s]*([0-9]+)[\s]*" \
... r"(Field 2):[\s]*([0-9 A-Za-z]+)[\s]*" \
... r"(Field 3):[\s]*([-+]?[0-9]+)[\s]*"
С этим изменением findall()
вернет только один кортеж найденных групп для всей строки. В этом кортеже за каждым ключом следует его значение:
>>> re.findall(regex, line)
[('Key', 'af12d9', 'Index', '0', 'Field 1', '1234', 'Field 2', '1234 Ring ', 'Field 3', '-10')]
Итак, я получаю кортеж ...
>>> found = re.findall(regex, line)[0]
>>> found
('Key', 'af12d9', 'Index', '0', 'Field 1', '1234', 'Field 2', '1234 Ring ', 'Field 3', '-10')
... и используя ломтики Я получаю только ключи ...
>>> found[::2]
('Key', 'Index', 'Field 1', 'Field 2', 'Field 3')
... а также только значения:
>>> found[1::2]
('af12d9', '0', '1234', '1234 Ring ', '-10')
Затем я создаю список кортежей, содержащих ключ и соответствующее ему значение, с помощью функции zip()
:
>>> zip(found[::2], found[1::2])
[('Key', 'af12d9'), ('Index', '0'), ('Field 1', '1234'), ('Field 2', '1234 Ring '), ('Field 3', '-10')]
Финал gran должен передать список кортежей конструктору dict()
:
>>> dict(zip(found[::2], found[1::2]))
{'Field 3': '-10', 'Index': '0', 'Field 1': '1234', 'Key': 'af12d9', 'Field 2': '1234 Ring '}
Я считаю это решение лучшим, но в некотором смысле это действительно субъективный вопрос. HTH в любом случае:)