Регулярное выражение python: создать словарь из строки

У меня есть жало, содержащее несколько сведений, которые я хочу сохранить в словаре:

s1 = "10:12:01    R1 3    E44"
s2 = "11:11:01    R100    E400"

pattern = "\d{2}:\d{2}:\d{2}(\,\d+)?" + \
          " +" + \
          "[0-9A-Za-z _]{2}([0-9A-Za-z _]{1})?([0-9A-Za-z _]{1})?" + \
          " +" + \
          "[0-9A-Za-z _]{2}([0-9A-Za-z _]{1})?([0-9A-Za-z _]{1})?$"

# --> 

d1 = {"time" : "10:12:01",
      "id1" : "R1 3", 
      "id2" : "E44"}

d2 = {"time" : "11:11:01",
      "id1" : "R100", 
      "id2" : "E400"}

есть ли способ сделать это напрямую с помощью python re?

Примечание. Мне известно, что здесь есть аналогичный вопрос: Строковый словарь регулярных выражений Python, однако формулировка не совсем указывает на то, что я ожидаю в качестве ответа.

Если вы хотите, чтобы регулярное выражение напрямую возвращало dict, нет.

knh190 21.05.2019 16:19
Именованные группы упростит задачу, но я не знаю, как напрямую вернуть карту из результата регулярного выражения.
JDB 21.05.2019 16:21

Ваши d1 и d2 не совпадают с s1 и s2, и вы можете использовать пробелы для разделения строки, проверьте мой ответ ниже @OliverWilken

Devesh Kumar Singh 21.05.2019 16:26

@Девеш Кумар Сингх: Спасибо, я исправил

Oliver Wilken 21.05.2019 16:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
721
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если информация четко разделена пробелами, почему бы не использовать эту информацию для разделения строки по пробелам и создания результирующего списка словарей. Если у нас есть несколько пробелов, мы можем игнорировать эти пробелы при разделении с помощью re.split.

import re

#List of strings
li = [ "10:12:01    R1 3    E44", "11:11:01    R100    E400"]

#List of kyes
keys = ['time', 'id1', 'id2']

#Create the dictionary from keys from keys listand values obtained by splitting string on 2 or more whitespaces
result = [{keys[idx]:re.split(r'\s{2,}', s)[idx] for idx in range(len(keys))} for s in li]

print(result)

Результат будет

[
{'time': '10:12:01', 'id1': 'R1 3', 'id2': 'E44'}, 
{'time': '11:11:01', 'id1': 'R100', 'id2': 'E400'}
]

в идентификаторе также могут быть пробелы. Я отредактирую свой вопрос, чтобы было ясно

Oliver Wilken 21.05.2019 16:29

Сколько пробелов? Укажите все возможные варианты строки

Devesh Kumar Singh 21.05.2019 16:30

Я обновил свой пример, чтобы учесть ваш обновленный пример, проверьте еще раз @OliverWilken :)

Devesh Kumar Singh 21.05.2019 16:42
Ответ принят как подходящий
>>> import re
>>> pattern = "(?P<time>\d{2}:\d{2}:\d{2}(\,\d+)?) +(?P<id1>[0-9A-Za-z_]{2}([0-9A-Za-z1-9_]{1})?([0-9A-Za-z_]{1})?) +(?P<id2>[0-9A-Za-z_]{2}([0-9A-Za-z1-9_]{1})?([0-9A-Za-z_]{1})?$)"
>>>
>>> s1 = "10:12:01    R123    E44"
>>> print(re.match(pattern, s1).groupdict())
{'time': '10:12:01', 'id1': 'R123', 'id2': 'E44'}

если вы измените шаблон на pattern = "(?P<time>\d{2}:\d{2}:\d{2}(\,\d+)?) +(?P<id1>[0-9A-Za-z _]{2}([0-9A-Za-z1-9 _]{1})?([0-9A-Za-z _]{1})?) +(?P<id2>[0-9A-Za-z _]{2}([0-9A-Za-z1-9 _]{1})?([0-9A-Za-z _]{1})?$)", он сработает

Oliver Wilken 21.05.2019 16:49

Другие вопросы по теме