У меня есть жало, содержащее несколько сведений, которые я хочу сохранить в словаре:
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, однако формулировка не совсем указывает на то, что я ожидаю в качестве ответа.
Ваши d1 и d2 не совпадают с s1 и s2, и вы можете использовать пробелы для разделения строки, проверьте мой ответ ниже @OliverWilken
@Девеш Кумар Сингх: Спасибо, я исправил






Если информация четко разделена пробелами, почему бы не использовать эту информацию для разделения строки по пробелам и создания результирующего списка словарей. Если у нас есть несколько пробелов, мы можем игнорировать эти пробелы при разделении с помощью 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'}
]
в идентификаторе также могут быть пробелы. Я отредактирую свой вопрос, чтобы было ясно
Сколько пробелов? Укажите все возможные варианты строки
Я обновил свой пример, чтобы учесть ваш обновленный пример, проверьте еще раз @OliverWilken :)
>>> 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})?$)", он сработает
Если вы хотите, чтобы регулярное выражение напрямую возвращало dict, нет.