为什么使用 re.search(r'regex').group() 做空不会缩短所有数字

  • 本文关键字:数字 regex re search group 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)))

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

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

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

您可以执行以下操作:

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

这个排序键可能应该写成一个正则函数。

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

使用.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()

只使用排序函数?

从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)

根据这个关于按多个属性排序的答案:

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

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

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

最新更新