Python正则表达式匹配整个文件名包括文件扩展名

时间:2017-09-01 16:57:50

标签: python regex

我想从标准的vsftp日志文件中获取整个文件名加扩展名。

文件如下:

Wed Aug 31 10:23:59 2017 1 ::ffff:172.18.1.168 18593420 /Shell_Scripting.sh b _ i r user1 ftp 0 * c
Wed Aug 31 10:24:18 2017 1 ::ffff:172.18.1.168 18593420 /test.txt b _ i r user1 ftp 0 * c

我试过正则表达式

pattern = re.compile(r'\/(\w+)')
match = pattern.search(ftpfile)
print match.group(1)

但唯一的匹配文件名(Shell_Scripting& test)不包含扩展名(.sh& .txt)。

我尝试了re.compile(r'\/(.+\.\w+)')re.compile(r'\/(\w+\.\w+)')

他们都显示AttributeError: 'NoneType' object has no attribute 'group'

正确的正则表达式应该与文件名匹配,包括文件扩展名吗?

3 个答案:

答案 0 :(得分:2)

您可以使用简单的正则表达式列表理解:

import re

log = """
Wed Aug 31 10:23:59 2017 1 ::ffff:172.18.1.168 18593420 /Shell_Scripting.sh b _ i r user1 ftp 0 * c
Wed Aug 31 10:24:18 2017 1 ::ffff:172.18.1.168 18593420 /test.txt b _ i r user1 ftp 0 * c
"""

rx = re.compile(r'/(\S+)')
filenames = [match.group(1) for line in log.split("\n") for match in rx.finditer(line)]
print(filenames)
# ['Shell_Scripting.sh', 'test.txt']

内心是/(\S+)部分,它会查找/,后跟至少一个非空白字符。

答案 1 :(得分:1)

您可以使用re.findall

import re

s = ['Aug 31 10:23:59 2017 1 ::ffff:172.18.1.168 18593420 /Shell_Scripting.sh b _ i r user1 ftp 0 * c', 'Wed Aug 31 10:24:18 2017 1 ::ffff:172.18.1.168 18593420 /test.txt b _ i r user1 ftp 0 * c']

files = [re.findall("[a-zA-Z_]+\.\w+", i) for i in s]

new_files = [i[0] for i in files if i]

输出:

['Shell_Scripting.sh', 'test.txt']

答案 2 :(得分:-2)

如果您只处理 sh txt 文件,则可以执行以下操作:

save