Игнорировать определенные слова в строке пути - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно обработать длинные пути, и я хотел бы игнорировать конкретные слова:

'/home/me/data/dataset/images/dark-side_23---83971436re.jpg'
'/home/me/data/dataset/images/medium-side_23---83971436re.jpg'
'/home/me/data/dataset/images/others_23---83971436re.jpg'

Таким образом, вывод должен быть:

side
side
others

Я использую это регулярное выражение:

pat = re.compile(r'/([^/]+)_\d+---.*.jpg$')
re.search(pat, path_string).groups()

И я пробовал что-то с отрицательным поиском, но не работает:

pat = re.compile(r'/(?!dark|medium)([^/]+)_\d+---.*.jpg$')

Есть идеи?

Редактировать: Извините, я забыл упомянутьчто они могут существовать в других строках, таких как:

'/home/me/data/dataset/images/light-side_23---83971436re.jpg'

Где он должен возвращаться:

light-side

Так что использование символа "-" в этом случае бесполезно.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

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

(?:(?:dark|medium)-)?([^/]+)_\d+---[^/]*\.jpg$

См. Демоверсию regex

Подробности

  • (?:(?:dark|medium)-)?- необязательная группа, совпадающая с 1 или 0 повторениями
    • (?:dark|medium) - dark или medium слов (если вы хотите избежать совпадения с ними как целыми словами, используйте (?:\b(?:dark|medium)-)?)
    • - - дефис
  • ([^/]+) - группа 1: любой один или несколько символов, отличных от /
  • _ - знак подчеркивания
  • \d+ - 1+ цифр
  • --- - три дефиса
  • [^/]* - 0+ символов, отличных от /
  • \.jpg- .jpg подстрока (. особенная, поэтому должна быть экранирована)
  • $ - конец строки.

Демонстрация Python :

import re
strs = ['/home/me/data/dataset/images/dark-side_23----83971436re.jpg',
            '/home/me/data/dataset/images/medium-side_23---83971436re.jpg',
            '/home/me/data/dataset/images/others_23---83971436re.jpg',
            '/home/me/data/dataset/images/light-side_23---83971436re.jpg']
rx = re.compile(r'(?:(?:dark|medium)-)?([^/]+)_\d+---[^/]*\.jpg$')
for s in strs:
    m = rx.search(s)
    if m:
        print(m.group(1))

Вывод:

side
side
others
light-side

ПРИМЕЧАНИЕ , что вы можете немного упростить его, если вы сначала захватите последнюю часть с помощью os.path.basename(os.path.normpath(s)).Затем вы можете использовать r'^(?:(?:dark|medium)-)?(.+)_\d+---.*\.jpg$'.Смотрите эту демонстрацию Python .

0 голосов
/ 06 февраля 2019

Использование ([^/]+)_\d+---.*\.jpg$ с условием:

import re
str_list = ['/home/me/data/dataset/images/dark-side_23----83971436re.jpg',
            '/home/me/data/dataset/images/medium-side_23---83971436re.jpg',
            '/home/me/data/dataset/images/others_23---83971436re.jpg',
            '/home/me/data/dataset/images/light-side_23---83971436re.jpg']

pat = re.compile(r'([^/]+)_\d+---.*\.jpg$')
for s in str_list:
    if "light" in s:
        print(re.search(pat, s).group(1))
    else:
        print(re.search(pat, s).group(1).rpartition('-')[2])

ВЫХОД:

side
side
others
light-side
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...