使用正则表达式从给定目录中提取文件名

时间:2019-06-29 05:31:49

标签: python regex python-3.x

我在正则表达式方面很弱。我正在寻找有关如何从以下字符串中提取.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 个答案:

答案 0 :(得分:2)

您可以匹配一个反斜杠,然后使用否定的字符类将一个与反斜杠匹配的组捕获。然后匹配一个点并保存。

您可以使用否定的前瞻来断言右边直接不是非空白字符的字符。

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

Regex demo

答案 1 :(得分:0)

Regex101(link):

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])

答案 2 :(得分:0)

以下模式应与文件名匹配:
(?=[^\\]*$).*\.sav

Regex101 Demo

以上模式断言(?=positive lookahead)直到字符串末尾的其他字符都不是反斜杠。因此,基本上,它会找到最后一个反斜杠,然后匹配所需的文本。有关其他详细信息,请参见上面链接的regex101演示右侧的“ EXPLANATION”。

答案 3 :(得分:0)

我假设您不是在学习正则表达式,而是想知道如何处理文件名解析。

我将使用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')
>>>

答案 4 :(得分:0)

您的问题是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()返回文件的名称而不是完整路径,这样可以节省一半的工作...

答案 5 :(得分:0)

我猜这些表情:

[^\\]+\.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']

Demo