import re PATTERN_BASIC = re.compile(r'#(.+?)#') def match_rules(filename, rules): for r in rules: match = r.apply(filename) if match: return r, match return None class FileRule: def __init__(self, rule, conf): # trouve les marqueurs dans la règle self.patterns = PATTERN_BASIC.findall(rule) rg = PATTERN_BASIC.sub(lambda m: self.regFor(match=m, conf=conf), rule) self.rule = re.compile(rg) # on garde la version compilée (donc optimisée) @staticmethod def regFor(match, conf): name = match.group(0) trunc_name = name[1:-1] if name == '#EXT#': return '(' + '|'.join(conf.extensions) + ')' elif name in ['#EPISODE_NUM#', '#SEASON_NUM#']: return '([0-9]+)' return '([^/]+)' def apply(self, filename): # applique la règle à un objet file match = self.rule.match(filename) if not match: return None # trouve les différents marqueurs de règle patterns = {} for i in range(len(self.patterns)): patterns[self.patterns[i]] = match.group(i + 1) return patterns