Извлечение имен файлов из заданного каталога с помощью регулярных выражений - PullRequest
2 голосов
/ 29 июня 2019

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

C: \ Users ... \ Standard Loadflows Seq и Dyn PSSEv34 - 2019-02-20 \ AutumnHi-20180531-183047-34-SystemNormal \ AutumnHi-20180531-183047-34-SystemNormal.sav

В настоящее время я использую этот код:

re.findall(r'\\(.+).sav',txt)

но он находит только

['Users\\...\\Standard Loadflows Seq and Dyn PSSEv34 - 2019-02-20\\AutumnHi-20180531-183047-34-SystemNormal\AutumnHi-20180531-183047-34-SystemNormal.sav was']

Я пытаюсь найти "AutumnHi-20180531-183047-34-SystemNormal.sav"

Я использую Python 3.7.

Ответы [ 6 ]

2 голосов
/ 29 июня 2019

Вы можете сопоставить обратную косую черту, а затем записать в группу, соответствующую не обратной косой черте, используя класс отрицанных символов. Затем сопоставьте точку и сохраните.

Вы можете использовать отрицательный взгляд, чтобы утверждать, что то, что прямо справа, не является символом без пробелов.

\\([^\\]+\.sav)(?!\S)

Regex demo

0 голосов
/ 29 июня 2019

Я предполагаю, что эти выражения:

[^\\]+\.sav
([^\\]+\.sav)

или что-то подобное, вероятно, извлекут то, что мы могли бы хотеть здесь.

Тест

import re

print(re.findall(r"([^\\]+\.sav)", "C:\\Users...\\Standard Loadflows Seq and Dyn PSSEv34 - 2019-02-20\\AutumnHi-20180531-183047-34-SystemNormal\\AutumnHi-20180531-183047-34-SystemNormal.sav"))

Выход

['AutumnHi-20180531-183047-34-SystemNormal.sav']

Демо

0 голосов
/ 29 июня 2019

Ваша проблема в том, что точка DOT слишком широка и фактически содержит обратную косую черту, поэтому ваше регулярное выражение соответствует первой обратной косой черте, а затем all пути до расширения ...

Чтобы сделать регулярное выражение намного проще и, кроме того, сделать кросс-платформенный код, вы можете использовать пакет os.path. Предполагая, что вы просматриваете каталог:

import os
import re

for file in os.listdir(dir):
    if re.search(".+sav$", file):
        return basename

Кроме того, в этом случае регулярное выражение не так уж нужно, и вы можете сделать:

import os

for file in os.listdir(dir):
    if os.path.splitext(file) == ".sav":
        return basename

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

0 голосов
/ 29 июня 2019

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

Я бы использовал модуль pathlib для обработки паролей.

C:\Users\barry>py -3.7
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pathlib
>>> filename = r'C:\Users\...\Standard Loadflows Seq and Dyn PSSEv34 - 2019-02-20\WinterLo-20180729-043047-34-SystemNormal\WinterLo-20180729-043047-34-SystemNormal.sav'
>>> path = pathlib.Path(filename)
>>> path.name
'WinterLo-20180729-043047-34-SystemNormal.sav'
>>> path.parent
WindowsPath('C:/Users/.../Standard Loadflows Seq and Dyn PSSEv34 - 2019-02-20/WinterLo-20180729-043047-34-SystemNormal')
>>>
0 голосов
/ 29 июня 2019

Следующий шаблон должен соответствовать имени файла:
(?=[^\\]*$).*\.sav

Regex101 Demo

Приведенный выше шаблон подтверждает (?= равно положительный взгляд ), что ни один другой символ до конца строки не является обратной косой чертой.По сути, он находит последний обратный слеш, а затем соответствует желаемому тексту.Дополнительные сведения см. В разделе «ОБЪЯСНЕНИЕ» справа от демонстрационной версии regex101 по ссылке выше.

0 голосов
/ 29 июня 2019

Regex101 ( ссылка ):

txt = r'''C:\Users\\...\\Standard Loadflows Seq and Dyn PSSEv34 - 2019-02-20\\WinterLo-20180729-043047-34-SystemNormal\\WinterLo-20180729-043047-34-SystemNormal.sav'''

import re

print(re.findall(r'(?<=\\)[^\\]+sav',txt)[0])

Печать:

WinterLo-20180729-043047-34-SystemNormal.sav

Вы можете достичь того же самого без re модуля:

print(txt.split('\\')[-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...