разделить на несколько символов в строке

У меня есть список имен файлов, которые мне нужно отсортировать по разделу в строке. Однако это работает только в том случае, если я сделаю расширение файла частью моего словаря сортировки. Я хочу, чтобы это работало, если файл имеет формат .jpg или .png, поэтому я пытаюсь разделить как «_», так и «.». персонаж.

sorting = ['FRONT', 'BACK', 'LEFT', 'RIGHT', 'INGREDIENTS', 'INSTRUCTIONS', 'INFO', 'NUTRITION', 'PRODUCT']

filelist = ['3006345_2234661_ENG_PRODUCT.jpg', '3006345_2234661_ENG_FRONT.jpg', '3006345_2234661_ENG_LEFT.jpg', '3006345_2234661_ENG_RIGHT.jpg', '3006345_2234661_ENG_BACK.jpg', '3006345_2234661_ENG_INGREDIENTS.jpg', '3006345_2234661_ENG_NUTRITION.jpg', '3006345_2234661_ENG_INSTRUCTIONS.jpg', '3006345_2234661_ENG_INFO.jpg']

sort = sorted(filelist, key = lambda x : sorting.index(x.re.split('_|.')[3]))

print(sort)

Это возвращает ошибку «AttributeError: объект« str »не имеет атрибута« re »».

Что мне нужно сделать, чтобы разделить как на _, так и на . при разделении моих строк для сортировки? Я хочу использовать разделение только для сортировки, а не для переформирования строк.


person Micah Edelblut    schedule 14.02.2020    source источник
comment
попробуйте x.split вместо x.re.split   -  person malmiteria    schedule 15.02.2020
comment
Отвечает ли это на ваш вопрос? Разделить строку на основе регулярного выражения   -  person Michael Bianconi    schedule 15.02.2020
comment
Это дает ошибку IndexError: список индексов вне диапазона, который, как я полагаю, означает, что он не делает достаточно разбиений, чтобы добраться до индекса [3].   -  person Micah Edelblut    schedule 15.02.2020
comment
re.split принимает первый аргумент в качестве регулярного выражения, а второй - в качестве входных данных, поэтому ваш синтаксис должен быть примерно таким, как re.split('_|.', x)[3], как указано в комментарии ниже.   -  person Guven Degirmenci    schedule 15.02.2020
comment
Пожалуйста, поделитесь всем сообщением об ошибке.   -  person AMC    schedule 15.02.2020
comment
AttributeError: у объекта 'str' нет атрибута 're' Я не уверен, какой ответ вы ожидаете. Можно поконкретнее в чем дело?   -  person AMC    schedule 15.02.2020


Ответы (1)


Вот фиксированный код:

sorted_output = sorted(filelist,key=lambda x: sorting.index(re.split(r'_|\.',x)[3])) 

Строка, введенная в re.split(), должна быть передана в качестве второго аргумента функции; вы не вызываете re.split() в строке. Первый аргумент - это само регулярное выражение, которое вы правильно указали.

Кроме того: вам нужно экранировать . с помощью \, потому что точка или точка — это специальный символ в регулярных выражениях, который соответствует всем.

Выход:

In [13]: sorted(filelist,key=lambda x: sorting.index(re.split(r'_|\.',x)[3]))                       
Out[13]: 
['3006345_2234661_ENG_FRONT.jpg',
 '3006345_2234661_ENG_BACK.jpg',
 '3006345_2234661_ENG_LEFT.jpg',
 '3006345_2234661_ENG_RIGHT.jpg',
 '3006345_2234661_ENG_INGREDIENTS.jpg',
 '3006345_2234661_ENG_INSTRUCTIONS.jpg',
 '3006345_2234661_ENG_INFO.jpg',
 '3006345_2234661_ENG_NUTRITION.jpg',
 '3006345_2234661_ENG_PRODUCT.jpg']

Изменить: как упоминает @Todd в комментариях, если вы хотите дополнительно убедиться, что строки отсортированы по числовой части после первой сортировки, используйте:

sorted(filelist,key=lambda x: [sorting.index(re.split(r'_|\.',x)[3]),x])
person mechanical_meat    schedule 14.02.2020
comment
Это выглядит хорошо. Просто хочу добавить, что если вы хотите сортировать по числовому префиксу в качестве вторичного ключа, используйте: [sorting.index(re.split(...)[3]), x] - person Todd; 15.02.2020
comment
@Todd: Спасибо за ваш комментарий. Я не уверен, что понимаю ваш пример кода. Не могли бы вы немного уточнить? - person mechanical_meat; 15.02.2020
comment
с удовольствием: sorted(filelist,key=lambda x: [sorting.index(re.split(r'_|\.',x)[3]), x]) ‹-- Я предлагал это. Если бы в списке имен файлов было несколько элементов, содержащих «FRONT», это отсортировало бы их сначала по индексам sorting (первичный ключ), а затем в алфавитно-цифровом порядке по имени файла (вторичный ключ). - person Todd; 15.02.2020
comment
Ах, мило. Понятно. Обновленный ответ, чтобы принять это во внимание. Спасибо еще раз. - person mechanical_meat; 15.02.2020