Регулярное выражение Python для пути к файлу Windows - PullRequest
0 голосов
/ 25 сентября 2018

Проблема, которая не может быть легко решена с помощью регулярного выражения, заключается в том, что я хочу иметь возможность извлечь путь к файлу Windows из произвольной строки.Самое близкое, что я смог получить (я пробовал кучу других), это использовать следующее регулярное выражение:

[a-zA-Z]:\\([a-zA-Z0-9() ]*\\)*\w*.*\w*

, которое выбирает начало файла и предназначено для просмотра шаблонов (после начальной буквы диска) строк с обратной косой чертой, заканчивающейся именем файла, необязательной точкой и необязательным расширением.

Сложность в том, что происходит дальше.Поскольку максимальная длина пути составляет 260 символов, мне нужно только подсчитать 260 символов после начала.Но поскольку в именах файлов разрешены пробелы (и другие символы), мне нужно убедиться, что нет дополнительных обратных слешей, которые могли бы указывать на то, что предшествующие символы - это имя папки, а то, что следует, не является именем файла, само по себе..

Я почти уверен, что не существует идеального решения (идеальное - быть врагом добра), но я удивлялся, может ли кто-нибудь предложить «наилучшее возможное» решение?

1 Ответ

0 голосов
/ 25 сентября 2018

Вот выражение, которое я получил, основываясь на вашем, которое позволяет мне найти путь в windows: [a-zA-Z]:\\((?:[a-zA-Z0-9() ]*\\)*).*.Пример его использования доступен здесь: https://regex101.com/r/SXUlVX/1

Сначала я изменил группу захвата с ([a-zA-Z0-9() ]*\\)* на ((?:[a-zA-Z0-9() ]*\\)*).
Ваше оригинальное выражение захватывает каждое XXX\ один за другим (Например: Users\ the Users\).
Шахт соответствует (?:[a-zA-Z0-9() ]*\\)*.Это позволяет мне захватить конкатенацию XXX\YYYY\ZZZ\ перед захватом.Таким образом, он позволяет мне получить полный путь.

Второе изменение, которое я сделал, связано с именем файла: я просто сопоставлю любую группу символов, которая не содержит \ (группа захватажадный).Это позволяет мне позаботиться о странных именах файлов.

Другое регулярное выражение, которое будет работать, будет: [a-zA-Z]:\\((?:.*?\\)*).*, как показано в этом примере: https://regex101.com/r/SXUlVX/2

На этот раз я использовал .*?\\ чтобы соответствовать XXX\ частям пути.
.*? будет соответствовать не жадному способу: таким образом, .*?\\ будет соответствовать минимальному минимуму текста, за которым следует обратная косая черта.

Не стесняйтесь, если у вас есть какие-либо вопросы относительно выражений.
Я также рекомендую вам попытаться увидеть, насколько хорошо работает ваше выражение, используя: https://regex101.com.Здесь также есть список различных токенов, которые вы можете использовать в своем регулярном выражении.

Редактировать: Поскольку мой предыдущий ответ не сработал (хотя мне нужно будет потратить несколько раз, чтобы выяснить, почему именно), я посмотрелдля другого способа сделать то, что вы хотите.И мне удалось сделать это, используя разбиение и объединение строк.
Команда: "\\".join(TARGETSTRING.split("\\")[1:-1]).
Как это работает: Размещает исходную строку в список подстрок на основе.Затем я удаляю первую и последнюю часть ([1:-1] от 2-го элемента до элемента перед последним) и преобразую полученный список обратно в строку.

Это работает, независимо от того, является ли указанное значение путем илиполный адрес файла.Program Files (x86)\\Adobe\\Acrobat Distiller\\acrbd.exe fred - это путь к файлу Program Files (x86)\\Adobe\\Acrobat Distiller\\acrbd.exe fred\ - это путь к каталогу

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