Регулярное выражение, совпадающее с именем файла с несколькими расширениями
Есть ли регулярное выражение для соответствия some.prefix
часть обоих из следующих имен файлов?
xyz
может быть любым персонажем[a-z0-9-_\ ]
some.prefix
часть может быть любым персонажем в[a-zA-Z0-9-_\.\ ]
,
Я намеренно включил .
в some.prefix
,
some.prefix.xyz.xyz
some.prefix.xyz
Я перепробовал много комбинаций. Например:
(?P<prefix>[a-zA-Z0-9-_\.]+)(?:\.[a-z0-9]+\.gz|\.[a-z0-9]+)
Работает с abc.def.csv
поймав abc.def
, но не в состоянии поймать это в abc.def.csv.gz
,
Я в основном использую Python, но я думал, что само регулярное выражение должно применяться ко многим языкам.
Обновление: это невозможно, см. Обсуждение с @nowox ниже.
2 ответа
Я думаю, что ваше регулярное выражение работает довольно хорошо. Я рекомендую вам попробовать regex101 на вашем примере:
https://regex101.com/r/dV6cE8/3
Выражение
^(?i)[ \w-]+\.[ \w-]+
Должно работать в вашем случае:
som e.prefix.xyz.xyz
^^^^^^^^^^^
some.prefix.xyz
^^^^^^^^^^^
abc.def.csv.gz
^^^^^^^
А в Python вы можете использовать:
import re
text = """some.prefix.xyz.xyz
some.prefix.xyz
abc.def.csv.gz"""
print re.findall('^(?i)[ \w-]+\.[ \w-]+', text, re.MULTILINE)
Который будет отображать:
['som e.prefix', 'some.prefix', 'abc.def']
Я могу подумать, что вы немного смущены своим требованием. Если я подведу итог, у вас есть путь из chars
а также dot
такие как:
foo.bar.baz.0
foobar.tar.gz
f.o.o.b.a.r
Как бы вы разделили эти строки на базовое имя и расширение? Здесь мы узнаем некоторые известные образцы .tar.gz
это определенно расширение, но .bar.baz.0
расширение или это только .0
?
Ответ не прост, и никакие регулярные выражения в этом мире не смогут угадать правильный ответ на 100% без каких-либо подсказок.
Например, вы можете перечислить приемлемые расширения и сделать несколько критериев:
- Расширение соответствует регулярному выражению
\.\w{1,4}$
- Несколько расширений могут быть объединены вместе
(\.\w{1,4}){1,4}$
- Остальное называется
basename
Из этого вы можете построить это регулярное выражение:
(?P<basename>.*?)(?P<extension>(?:\.\w{1,4}){1,4})$