Python регулярное выражение необязательная группа захвата с положительным взглядом - PullRequest
0 голосов
/ 23 октября 2018

пытается найти определенные шаблоны папок.у меня может быть простое утверждение if, но теперь мне интересно, можно ли это сделать в одном шаблоне регулярных выражений?

папок:

name
name_a01
name_a02
..
name_a20

name_dontuse_a10 <не хотите этот шаблон </p>

pattern = re.match(".*name(_a[0-9])?", dir)

вышеупомянутое совпадение корректно, но оно совпадает с name и name_dontuse_a10

pattern.group(1)

возвращает None для обеих этих папок, так что мне это мало поможет.

Я не могу предсказать, как будут названы нежелательные папки, но я хочу и папку с базовым именем, и любую name_a## folder.Я думаю, что мне нужно посмотреть в будущее, но я не знаю, как использовать это с дополнительной группой захвата.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Лучшее решение - сначала извлечь имя файла из пути, чтобы вам не приходилось с ним обращаться в своем регулярном выражении.normpath удаляет любые конечные /, а basename извлекает имя файла.Таким образом, для dir1/dir2/name/ вы получите name.

import os, re

dir = ...
name = os.path.basename(os.path.normpath(dir))

pattern = re.match("name(_a\d+)?", name)

Обратите внимание, что в вашем исходном решении происходило то, что .* соответствовал всей строке, что приводило к неожиданному поведению.

0 голосов
/ 23 октября 2018

Попробуйте использовать это:

pattern = re.match(".*name(_a[0-9]*)?$", dir)

Я только что добавил $, чтобы соответствовать концу строки после первого подчеркивания.Я также добавил [0-9]*, чтобы соответствовать нулю или более цифр.

Live Пример:

https://regex101.com/r/MSldc6/2/

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