Регулярное выражение, совпадающее с именем файла с несколькими расширениями

Есть ли регулярное выражение для соответствия 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})$

Попробуй это[a-z0-9-_\\]+\.[a-z0-9-_\\]+[a-zA-Z0-9-_\.\\]+

Другие вопросы по тегам