所以我有一个字符串路径列表:
x = ['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png',
'../../scene/temp_5a/458754/3_car.png']
我需要按_car
前面的数字对其进行排序。有谁知道快速的方法吗?
我目前有这个,但看起来拆分正在获取所有数字。我只想在_car
前面找到前面的数字。
def atoi(text):
return int(text) if text.isdigit() else text
def natural_keys(text):
return [ atoi(c) for c in re.split('(\d+)', text) ]
x.sort(key=natural_keys) # gives an error
答案 0 :(得分:1)
我的方法是拆分字符串并使用_car
前面的数字作为key
进行比较。
>>> x = [
... '../../scene/temp_5a/458754/1_car.png',
... '../../scene/temp_5a/458754/2_car.png',
... '../../scene/temp_5a/458754/10_car.png',
... '../../scene/temp_5a/458754/15_car.png',
... '../../scene/temp_5a/458754/3_car.png']
>>>
>>> sorted(x,key=lambda i: int(i.split('/')[-1].split('_')[0]))
[[1, '../../scene/temp_5a/458754/1_car.png'], [2, '../../scene/temp_5a/458754/2_car.png'], [3, '../../scene/temp_5a/458754/3_car.png'], [10, '../../scene/temp_5a/458754/10_car.png'], [15, '../../scene/temp_5a/458754/15_car.png']]
答案 1 :(得分:1)
x = ['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png',
'../../scene/temp_5a/458754/3_car.png']
sorted(x,key=lambda x: int(x.split('/')[-1].split('_car')[0]))
Out[118]:
['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/3_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png']
答案 2 :(得分:1)
我不确定为什么你的正则表达式给了你一个错误,它对我有用。也许尝试不同的正则表达式?
用x = ['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png',
'../../scene/temp_5a/458754/3_car.png']
def atoi(text):
return int(text) if text.isdigit() else text
def natural_keys(text):
return [ atoi(c) for c in re.split(r'.*\/([^_]*)_.*', text) ]
x.sort(key=natural_keys)
print x
取代你的作品可能也有效:
['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/3_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png']
输出:
option1.matches("[xXyY]")
答案 3 :(得分:1)
字符串匹配是正则表达式的作用。需要很少的正则表达式。
import re
x = ['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png',
'../../scene/temp_5a/458754/3_car.png']
def file_matcher(files):
numbers = []
for f in files:
match = re.search(r'([0-9]+)_car.png', f)
numbers.append(match.group(1))
return numbers
print file_matcher(x)