Я пытаюсь использовать регулярные выражения в python для соответствия компоненту номера кадра файла изображения в последовательности изображений. Я хочу придумать решение, которое охватывает несколько различных соглашений об именах. Если я помещаю это в слова, я пытаюсь сопоставить последний экземпляр одного или нескольких чисел между двумя точками (например, .0100.). Ниже приведен пример того, как моя текущая логика падает:Python Regular Expression - справа налево
import os
import re
def sub_frame_number_for_frame_token(path, token='@'):
folder = os.path.dirname(path)
name = os.path.basename(path)
pattern = r'\.(\d+)\.'
matches = list(re.finditer(pattern, name) or [])
if not matches:
return path
# Get last match.
match = matches[-1]
frame_token = token * len(match.group(1))
start, end = match.span()
apetail_name = '%s.%s.%s' % (name[:start], frame_token, name[end:])
return os.path.join(folder, apetail_name)
# Success
eg1 = 'xx01_010_animation.0100.exr'
eg1 = sub_frame_number_for_frame_token(eg1) # result: [email protected]@@@.exr
# Failure
eg2 = 'xx01_010_animation.123.0100.exr'
eg2 = sub_frame_number_for_frame_token(eg2) # result: [email protected]@@.0100.exr
Я понимаю, что есть и другие способы, в которых я могу решить эту проблему (я уже реализовал решение, в котором я разделив путь на точке и принимая последний элемент, который является числом), но я пользуюсь этой возможностью, чтобы узнать что-то о регулярных выражениях. Кажется, что регулярное выражение создает группы слева направо и не может использовать символы в шаблоне более одного раза. Во-первых, так или иначе, чтобы искать строку справа налево? Во-вторых, почему шаблон не находит два совпадения в eg2 (123 и 0100)?
Приветствия
Это лучше? 'pattern = r '\. (\ d + \.) +'' – hughdbrown
@hughdbrown Это не его проблема ... найдите 'finditer'. Anyways @ Yani, вы должны искать 'finditer' тоже. :) Он возвращает итератор по всем * неперекрывающимся * совпадениям. Его вторая строка - 'xx01_010_animation.123.0100.exr''. Список, называемый 'match', возвращает только 1 элемент, потому что совпадения совпадают. – Shashank
Я не уверен, что понимаю код, который вы даете, но моя первая мысль для поиска строки справа налево - это изменить строку ('example [:: - 1]'). Поскольку ваш шаблон ('\. (\ D +) \.') Является симметричным, похоже, что он сработает. Этот вариант уже исключен? –