使用Lambda和正则表达式在Python中对列表进行排序

3
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: ........)

我想按照最早的日期顺序对列表进行排序。我该如何使用lambda和regex进行操作?


你为什么有这些奇怪的字符串?给定列表的预期输出是什么? - timgeb
抱歉,原始字符串中有“<”字符,影响了其显示方式。如您所见,我已编辑了问题。 - dratoms
1
避免使用“list”作为变量名,因为已经有内置的“list”。 - timgeb
是的,"list"不应该被用作变量名。谢谢。 - dratoms
3个回答

2

你所拥有的代码足以完成以下操作:

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) 

谢谢你提供那个语法。对我来说,那是很难理解的。还有,感谢你提供那个简洁的小函数。虽然列表元素部分是自动生成的,而且不太可能出现缺失值,但是你的函数将在未来帮助我很多,因为我是 Python(以及编程)的新手。 - dratoms

0
你可以使用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]))

我到目前为止还没有使用过dateutil。但它似乎很有前途。我会记在心里的。 - dratoms

0

我认为最简单的解决方案,而不需要任何导入,是:

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']

最后一个字符串的日期偏移量略有不同。我认为OP的意图是xxxx和yyyyy可以是任意长度的字符串。 - Duncan
确切地说,这里可能会有其他字符串数字出现在正则表达式模式之前,这会妨碍自然排序。 - dratoms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接