我的琴弦看起来像“co1/co2”,“co3/co4”……CO11/CO12英寸
将其描述为regex:

^(?P<prefix>\w\w)(?P<month>\d+)/(?P<prefix2>\w\w)(?P<month2>\d+)$

我想根据等价于“正则表达式”的“月份”组来排序这些字符串的集合。(字符串中的第一个数字(例如“CO1/CO2”中的“1”或“CO12/CO13”中的“12”)
不过,我无法找到可以在sorted()中使用的lambda函数来实现这一点。
wrong_order = [u'co1/co2', u'co10/co11', u'co11/co12', u'co12/co13', u'co2/co3',
       u'co3/co4', u'co4/co5', u'co5/co6', u'co6/co7', u'co7/co8', u'co8/co9',
       u'co9/co10']


correct_order = [u'co1/co2', u'co2/co3', u'co3/co4', u'co4/co5', u'co5/co6', \
u'co6/co7', u'co7/co8', u'co8/co9', u'co9/co10', u'co10/co11', u'co11/co12', u'co12/co13']


#this lambda function doesn't work
output = sorted(wrong_order, key=lambda x: (x[2:]))

最佳答案

没有正则表达式:

lambda x: int(x.partition('/')[0][2:])

这将在/之前获取字符串的一部分,然后将除起始co之外的所有内容转换为整数。
我用了str.partition()因为它比str.split()更快,只对分裂一次的情况。
演示:
>>> wrong_order = [u'co1/co2', u'co10/co11', u'co11/co12', u'co12/co13', u'co2/co3',
...        u'co3/co4', u'co4/co5', u'co5/co6', u'co6/co7', u'co7/co8', u'co8/co9',
...        u'co9/co10']
>>> sorted(wrong_order, key=lambda x: int(x.partition('/')[0][2:]))
[u'co1/co2', u'co2/co3', u'co3/co4', u'co4/co5', u'co5/co6', u'co6/co7', u'co7/co8', u'co8/co9', u'co9/co10', u'co10/co11', u'co11/co12', u'co12/co13']

07-26 09:23