我在正则表达式方面很弱。我正在寻找有关如何从以下字符串中提取.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。
答案 0 :(得分:2)
您可以匹配一个反斜杠,然后使用否定的字符类将一个与反斜杠匹配的组捕获。然后匹配一个点并保存。
您可以使用否定的前瞻来断言右边直接不是非空白字符的字符。
\\([^\\]+\.sav)(?!\S)
答案 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
以上模式断言(?=
是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']