Регулярное выражение: Найдите все после точки, перед последней косой чертой

#python #regex

Вопрос:

Я нашел несколько похожих вопросов о регулярных выражениях, но я стараюсь превратить эти ответы в то, что я пытаюсь сделать. У меня есть такая строка:

Y:Pathsub pathname_of_folder.microphones.flac24trackname01.flac

Я хочу вернуть «flac24».

Количество периодов в папке name_of_folder будет разным. Я понял, как изолировать текст между двумя последними косыми чертами, но, похоже, теперь я не могу получить часть после последнего периода:

(?<=\)[^\]*(?=\[^\]*$)

Спасибо!

Комментарии:

1. Является ли цель всегда папкой файла?

2. Да, это всегда будет родительская папка файла.

Ответ №1:

Для регулярного выражения я бы сделал:

 .([^.\] )\[^\] $
 

ДЕМОНСТРАЦИЯ

Поскольку вы отметили этот Python, вы также можете подумать о том, чтобы просто использовать Pathlib

 from pathlib import PureWindowsPath 

p=PureWindowsPath(r'Y:Pathsub pathname_of_folder.microphones.flac24trackname01.flac')

>>> p.parts[-2].split('.')[-1]
flac24
 

Комментарии:

1. Это сработает! Спасибо за быструю помощь. Я пытаюсь поместить все это в одну строку, потому что на самом деле я передаю регулярное выражение в скрипт python в качестве переменной, поэтому я использую eval() для его выполнения. Однако Pathlib выглядит интересно. Я не знаком с этим, но проверю это в будущем.

2. На самом деле я передаю регулярное выражение в скрипт python в качестве переменной, поэтому для его выполнения я использую eval (). Осторожно eval ! Существует множество других способов передачи регулярного выражения в качестве переменной. Это просто строки, поэтому вы можете легко передать их как строку.

3. Что бы вы тогда посоветовали вместо этого? Я пытаюсь сделать свой скрипт python достаточно универсальным, чтобы я мог создавать различные команды синтаксического анализа в файле конфигурации, а затем использовать eval() — по крайней мере, я думал, что это имеет смысл: например, у меня есть это "Date": "=re.search(r'\d{4}-\d{}-\d{2}',file).group()" в файле JSON, а затем я делаю это: if settings["tags"][key][0:1] == '=': value = eval(settings["tags"][key][1:])

4. Зависит от того, предназначен ли сценарий для вашего собственного использования или «в дикой природе». Если вы хотите обеспечить безопасность, вы можете сделать "DateRE": "\d{4}-\d{}-\d{2}" это внутри файла конфигурации; обнаружьте этот ключ в JSON, а затем просто используйте строку внутри регулярного выражения в своем сценарии, если она присутствует, или по умолчанию, если нет.

Ответ №2:

Вы можете использовать

 \[^\]*.([^\]*)\[^\]*$
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • \ — а чар
  • [^\]* — ноль или более символов, отличных от максимально возможного числа
  • . — а . чар
  • ([^\]*) — Группа 1: ноль или более символов, отличных от символа
  • \ — а чар
  • [^\]* — ноль или более символов, отличных от символа
  • $ — конец веревки.

Смотрите демонстрационную версию Python:

 import re
regex = r"\[^\]*.([^\]*)\[^\]*$"
x = "Y:\Path\sub path\name_of_folder.microphones.flac24\trackname01.flac"
match = re.search(regex, x)
if match:
    print(match.group(1))