我正在尝试在 python 中使用正则表达式来匹配图像序列中图像文件的帧号组件。我想提出一个涵盖许多不同命名约定的解决方案。如果我把它变成文字,我试图匹配两个点之间的一个或多个数字的最后一个实例(例如 0.0100。)。以下是我当前逻辑如何下降的示例:
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: xx01_010_animation.@@@@.exr
# Failure
eg2 = 'xx01_010_animation.123.0100.exr'
eg2 = sub_frame_number_for_frame_token(eg2) # result: xx01_010_animation.@@@.0100.exr
我意识到还有其他方法可以解决这个问题(我已经实施了一个解决方案,我在点处分割路径并采用最后一项是数字)但我借此机会学习一些关于常规的知识表达式。看起来正则表达式从左到右创建组,并且不能在模式中多次使用字符。首先,无论如何要从右到左搜索字符串?其次,为什么模式没有在 eg2 中找到两个匹配项(123 和 0100)?
干杯