У меня есть имя файла, в котором есть некоторые лишние слова, от которых я хочу избавиться: VIS
, THE
и т.д.
Я был этим регулярным выражением, но проблема в том, что слова, которые нужно удалить, могут отображаться в начале или в конце имени файла. Чтобы сделать более ясным, некоторые образцы имен файлов:
filenames = ['a_VIS-MarnehNew_24RGB_1110.jpg',
'Marne_04_Vis.jpg',
'VIS_jeep_smoke.jpg',
'IR_fk_ref_01_005.jpg',
'c_LWIR-MarnehNew_24RGB_1110.jpg',
'LWIR-MarnehNew_15RGB_603.jpg',
'Movie_01_IR.jpg',
'THE_fk_ge_03_005.jpg']
И лишние слова - это VIS
, Vis
, IR
, LWIR
, THE
и каждый персонаж перед ними, если они появляются спереди или каждый символ после них, если они появляются сзади.
Правильными примерами будут:
filenames = ['MarnehNew_24RGB_1110',
'Marne_04',
'jeep_smoke',
'fk_ref_01_005',
'MarnehNew_24RGB_1110',
'MarnehNew_15RGB_603',
'Movie_01',
'fk_ge_03_005']
Я пробовал этот код, но (очевидно, этого недостаточно для задних случаев:
import re
pattern = re.compile('(?:VIS|Vis|IR|LWIR)(?:-|_)(\w+)')
for i, filename in enumerate(filenames):
matches = re.search(pattern, filename)
if matches:
print(i, matches.group(1))
0 MarnehNew_24RGB_1110
2 jeep_smoke
3 fk_ref_01_005
4 MarnehNew_24RGB_1110
5 MarnehNew_15RGB_603
Итак, как мне удается также избавиться от задних слов?
Используя ваши примеры, вы можете использовать
(?:^(?:\w_)?(?:VIS|Vis|IR|LWIR|THE)[-_]?)
|
(?:_?(?:VIS|Vis|IR|LWIR))?\.jpg$
Который должен быть заменен ничем, см. Демонстрацию на regex101.com.
(?: # non-capturing group
^ # anchor at the beginning of a string
(?:\w_)? # \w_ optional
(?:VIS|Vis|IR|LWIR|THE) # one of ...
[-_]? # - or _ optional
)
| # OR
(?:
_?
(?:VIS|Vis|IR|LWIR)
)?
\.jpg$
abcdef_VIS_a.jpg
. Я также не совсем уверен, может ли каждый символ до этого быть прочитан как только 1 символ, но опять же тестовые примеры, кажется, подразумевают это (или не достаточно хороши). Но я мог бы также подумать об этом.
a_VIS-
удаляется из первого примера? Это не соответствует шаблону.