сортировать список с помощью лямбда-выражения и регулярных выражений в python - PullRequest
0 голосов
/ 14 ноября 2018
list = ['xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime', 'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 'yyyyy' ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime]

datet = re.compile(r'ResultDatetime:(\d{4}-\d{2}-\d{2} \d{2}:\d{2})')

list.sort(key = lambda x: ........)

Я хочу отсортировать списки в порядке, начиная с самой ранней даты. Как я должен делать это с помощью лямбда-выражения и регулярных выражений?

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать dateutil.parser.parse (см. Этот ответ: Разобрать строки даты? ), чтобы проанализировать дату, и re.findall, чтобы получить ее отстрока

import re     
from dateutil.parser import parse

list = ['xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime', 'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime]
datet = re.compile(r'ResultDatetime:(\d{4}-\d{2}-\d{2} \d{2}:\d{2})')

list.sort(key = lambda x : parse(re.findall(datet, x)[0]))
0 голосов
/ 14 ноября 2018

Я думаю, что самое простое решение без импорта было бы:

data  = ['xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime',
         'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 
         'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime']

sorted_data = sorted(data, key=lambda x: x[20:36])

print(sorted_data)

Вывод:

        ['xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime', 
         'xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime', 
         'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime']
0 голосов
/ 14 ноября 2018

С имеющимся у вас кодом достаточно сделать:

list.sort(key=lambda x: datet.search(x).group(1))

(но, пожалуйста, не используйте list в качестве имени переменной).

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

Обратите внимание, однако, что если какая-либо строка не соответствует регулярному выражению, это вызовет ошибку, поэтому вы можетеЛучше разделить ключ на именованную многострочную функцию и проверить успешное совпадение перед возвратом сопоставленной группы.

def sort_key(line):                                                                                                                                               
    match = datet.search(line)                                                                                                                                               
    if match:                                                                                                                                                     
        return match.group(1)                                                                                                                                                    
    return ''        

data = [
    'xxxx ResultDatetime:2017-05-31 09:38:00.000:ResultDatetime',
    'xxxx ResultDatetime:2017-05-26 15:36:00.000:ResultDatetime',
    'yyyyy ResultDatetime:2017-10-23 16:16:00.000:ResultDatetime'
]
data.sort(key=sort_key) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...