为什么使用re.search(r'regex')。group()进行短路并不能全部短路

时间:2018-11-12 21:52:41

标签: python

我有一个文件名列表:

a = ['data_1-0.hamster.raw',
     'data_0-0.hamster.raw',
     'data_9-1.hamster.raw',
     'data_2-0.hamster.raw',
     'data_0-1.hamster.raw',
     'data_0-10.hamster.raw',
     'data_0-2.hamster.raw']

我想对这个列表进行排序,以便得到以下输出:

a = ['data_0-0.hamster.raw',
     'data_0-1.hamster.raw',
     'data_0-2.hamster.raw',
     'data_0-10.hamster.raw',
     'data_1-0.hamster.raw',
     'data_2-0.hamster.raw',
     'data_9-1.hamster.raw']

这是我编写的代码:

sorted(a, key=lambda f: int(re.search(r'-(\d+)[^-]*$', f).group(1)))

但是我对re语法有点困惑,这就是我得到的:

a = ['data_1-0.hamster.raw',
     'data_0-0.hamster.raw',
     'data_2-0.hamster.raw',
     'data_9-1.hamster.raw',
     'data_0-1.hamster.raw',
     'data_0-2.hamster.raw',
     'data_0-10.hamster.raw']

似乎它对连字符后的数字起作用,而不对第一个数字起作用。

5 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

import re


pattern = re.compile('data_(\d+)-(\d+)')

a = ['data_1-0.hamster.raw',
     'data_0-0.hamster.raw',
     'data_9-1.hamster.raw',
     'data_2-0.hamster.raw',
     'data_0-1.hamster.raw',
     'data_0-10.hamster.raw',
     'data_0-2.hamster.raw']

result = sorted(a, key=lambda s: tuple(map(int, pattern.search(s).groups())))
print(result)

输出

['data_0-0.hamster.raw', 'data_0-1.hamster.raw', 'data_0-2.hamster.raw', 'data_0-10.hamster.raw', 'data_1-0.hamster.raw', 'data_2-0.hamster.raw', 'data_9-1.hamster.raw']

答案 1 :(得分:1)

此sortkey可能应作为常规函数编写。

import re

def sortkey(string):
    numbering = re.search('\d+-\d+', string).group()
    first, second = map(int, numbering.split('-'))
    return first, second

演示:

>>> a = ['data_1-0.hamster.raw',
...:     'data_0-0.hamster.raw',
...:     'data_9-1.hamster.raw',
...:     'data_2-0.hamster.raw',
...:     'data_0-1.hamster.raw',
...:     'data_0-10.hamster.raw',
...:     'data_0-2.hamster.raw']
...:     
>>> sorted(a, key=sortkey)
>>> 
['data_0-0.hamster.raw',
 'data_0-1.hamster.raw',
 'data_0-2.hamster.raw',
 'data_0-10.hamster.raw',
 'data_1-0.hamster.raw',
 'data_2-0.hamster.raw',
 'data_9-1.hamster.raw']

答案 2 :(得分:0)

使用.sort()函数

 a = ['data_1-0.hamster.raw',
 'data_0-0.hamster.raw',
 'data_9-1.hamster.raw',
 'data_2-0.hamster.raw',
 'data_0-1.hamster.raw',
 'data_0-10.hamster.raw',
 'data_0-2.hamster.raw'] 

 a.sort()

答案 3 :(得分:0)

只需使用排序功能?

  

从Python 2.4开始,list.sort()和sorted()都添加了一个关键参数,以指定要在进行比较之前在每个列表元素上调用的函数。

因此,您拥有:https://repl.it/@skapin/NormalTrustworthyJumpthreading

a = ['data_1-0.hamster.raw',
    'data_0-0.hamster.raw',
    'data_9-1.hamster.raw',
    'data_2-0.hamster.raw',
    'data_0-1.hamster.raw',
    'data_0-10.hamster.raw',
    'data_0-2.hamster.raw']


def by_id(item):
  return item.split('_')[1].split('.')[0]

a.sort(key=by_id)
print(a)

答案 4 :(得分:0)

this answer开始,按多个属性排序:

  

键可以是返回元组的函数。

我们可以简化您的RegEx,并使用以下命令将输出转换为tuple

sorted(a,key = lambda f: [int(i) for i in tuple(re.findall(r'\d+',f))])