Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите написать regex

Darkloke Знаток (341), закрыт 11 месяцев назад
Помогите написать regex для total commander'a (там вроде есть свои отличия) для массового переименования файлов по следующим условиям.

Образцы текста

 6556af15ffe17d5df7418f26AM10915The20Aristocratlo
6556af15ffe17d5df7418f27AM10918A20Man20of20Many20Hatslo
6556af15ffe17d5df7418f33AM10902Chief20InspectorNoSoloVlnlo
6556af15ffe17d5df7418f35AM10905BupkisNoSoloClarinetlo
6556af15ffe17d5df7418f36AM10907The20Earl20of20KentuckyNoBanjolo
6556af15ffe17d5df7418f38AM10910Danse20MacabreNoSoloVlnlo
6556af15ffe17d5df7418f40AM10922Barber20of20SevilleNoGtrslo
  1. В начале строки идут любые цифры и буквы до "AM"
  2. После "AM" идут только цифры до собственно слов
  3. Слова идут как слитно, так и через "20" вместо пробелов
  4. Заканчивается строка всегда на "lo"

В общем-то проблема в том как заменить "20" на пробелы и как это сделать в TC. Общий regex вроде такой, но как заменить "20" (или не захватывать их), я хз. Я понимаю, что можно сделать regex-replace, а потом уже заменить 20 на пробелы, но хотелось бы всё сделать одним шагом.
 `\w+AM\d+(.*?)lo` 
Лучший ответ
Остальные ответы
ivan866_z Просветленный (22099) 1 год назад
если '20' встречается ТОЛЬКО окруженная буквами, то проще всего сделать вот так
Андрей ПанаринИскусственный Интеллект (274854) 1 год назад
А \w случайно не соответствует цифрам?
ivan866_z Просветленный (22099) Андрей Панарин, если нужно, можешь заменить \w на [A-Za-z]
DarklokeЗнаток (341) 1 год назад
Если делать так, то получается, что он пропустит случаи без 20 вообще и сделает только одну замену, если 20ок больше одного.
ivan866_z Просветленный (22099) Darkloke, я не вижу что у тебя написано в выражении, плохое качество нет, он должен заменить ВСЕ, если только не стоит галочка '1x' альтерантивно, можешь заменить на - но это то же самое
DarklokeЗнаток (341) 1 год назад
Само по себе (\B)20(\B) работает, но как мне интегрировать его в общее выражение?
 \w+AM\d+(.*?)lo 
ivan866_z Просветленный (22099) Darkloke, для чего тебе это нужно?
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (273829) 1 год назад
 #!/usr/bin/env python 
# -*- coding: utf-8 -*-

import os
import re

# Функция для переименования файлов в соответствии с заданными условиями
def rename_files(path):
# Получаем список файлов в указанной директории
files = os.listdir(path)

# Регулярное выражение для поиска соответствующих файлов
pattern = re.compile(r'(\d+)AM(\d+)(.*?)(?=lo)')

# Проходим по всем файлам в директории
for file in files:
# Проверяем, является ли текущий файл директорией
if os.path.isfile(os.path.join(path, file)):
# Применяем регулярное выражение к имени файла
new_name = re.sub(pattern, r'\1AM\2\3', file)
# Полный путь к старому файлу
old_path = os.path.join(path, file)
# Полный путь к новому файлу
new_path = os.path.join(path, new_name)
# Переименовываем файл
os.rename(old_path, new_path)
print(f'Renamed {old_path} to {new_path}')

# Вызываем функцию для переименования файлов в указанной директории
rename_files('/path/to/your/directory')
ivan866_zПросветленный (22099) 1 год назад
это неплохой способ, но намного рискованнее, потому что ты не видишь конечный результат перед тем как запускать
рекомендую сначала тестировать на КОПИИ папки с файлами
Похожие вопросы