Я пытаюсь сопоставить несколько различных синтаксисов имен файлов с одним регулярным выражением. Другими словами, я пытаюсь сопоставить строку имени файла с одинаковыми символами в разных порядках. Проблема в том, что я не знаю, как связать воедино "ИЛИ" | случаи, когда речь идет о группах.
Групповой синтаксис:
- Названия продуктов представляют собой любую букву, любое число с необязательными «-», «_» или пробелами между символами. «-», «_» или пробелы никогда не ставятся в начале или конце названия продукта.
- PAF или PA всегда имеют начальный "-", за которым следует трейлинг "-", а затем номер.
- Коды редакций составляют «FG», «RD», «X», «A» или «\ d +», все, кроме последнего, за которым следуют непосредственно, кроме числа.
- Номер листа в нижнем или верхнем регистре (отсюда re.IGNORECASE), перед которым ставится пробел или ничто, затем слово «лист», затем пробел или ничто и затем число.
Имена файлов следуют за этими образцами:
- (Название продукта) - (PAF / PA- #) (Лист №) - (Редакция)
- (\ ш (: \ ш * (: - |? \ S | _) \ ш +) *?) (- PA (: F |) - \ d +?) (?:? (: \ S | -) листа (?: \ S | -) \ d +) (- (?: FG | РД | Х | А |) \ d +)
- (Название продукта) - (PAF / PA - #) - (Редакция) (Лист №)
- (\ ш (: \ ш * (: - |? \ S | _) \ ш +) *?) (- PA (: F |) - \ d +?) (?:? (: \ S | -) листа (?: \ S | -) \ d +) (- (?: FG | РД | Х | А |) \ d +)
- (Название продукта) - (PAF / PA - #) - (Редакция)
- (\ ш (: \ ш * (: - | \ S | _) \ W +) *??) (- PA (: F |) - \ d +) (- (?: FG | RD | X | |) \ d +)
- (Название продукта) - (Редакция) (Лист №)
- (\ ш (: \ ш * (: - | \ S | _) \ W +) *??) (- (?: FG | RD | X | |) \ d +) (:(? : \ s | -) листа (?: \ s | -) \ d +)
- (Название продукта) - (Редакция)
- (\ ш (: \ ш * (: - |?? \ S | _) \ ш +) *) (- (?: FG | RD | X | |) \ d +)
PAF PA - обозначения типа продукта, Sheet # - бесполезная информация, а FG #, RD #, X #, A # или # - версии продукта. Мне нужно, чтобы название продукта, обозначение и ревизия были в их собственной группе.
^(\w(?:\w*(?:-|\s|_)?\w+)*)
(?:
(-(?:FG|RD|X|A|)\d+)|
(-PA(?:F|)-\d+)(-(?:FG|RD|X|A|)\d+)|
(-PA(?:F|)-\d+)(?:(?:\s|-)sheet(?:\s|-)\d+)|
(-PA(?:F|)-\d+)(?:(?:\s|-)sheet(?:\s|-)\d+)(-(?:FG|RD|X|A|)\d+)
)
(?:.*)?$
Я пробовал приведенное выше регулярное выражение, но оно не работает правильно. Сначала возвращается слишком много групп, мне бы хотелось только 3.
pattern = re.compile(r'''^(\w(?:\w*(?:-|\s|_)?\w+)*) # match any alphanumeric and dashes without leading or trailing dashes
(-PA(?:F|)-\d+) # match '-PAF-<number>' or '-PA-<number>'
(?:(?:\s|-|)?sheet(?:\s|-|)?\d+)? # match '?sheet?<number>' where ? can be <space> or '-'
(-(?:FG|RD|X|A|)\d+)? # match '-FG<number>', '-RD<number>', '-X<number>', '-A<number>' or <number>
(?:.*)?$''', flags=re.IGNORECASE|re.VERBOSE)
Вышеупомянутые строки должны совпадать с регулярным выражением.