2017-09-01 1485 views
1

我想从标准vsftp日志文件中获取整个文件名和扩展名。Python正则表达式匹配整个文件名包含文件扩展名

的文件是如下:

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 &试验)不包括扩展名(.SH & .TXT)。

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

他们都表现出AttributeError: 'NoneType' object has no attribute 'group'

什么应该是正确的正则表达式匹配文件名包含文件扩展名?

+0

不要尝试正则表达式匹配文件名。那么空间呢?其他有趣的角色呢,都是由本地文件系统所允许的?怎么样多个'.ext.ens.ions'?取而代之的是将部件匹配到“18593420”,然后匹配一组'。+',然后匹配'b_i r user1 ftp 0 * c'-part。 – user2722968

+0

@ user2722968感谢提醒。是的,空白空间应该是一个问题。我会尝试另一种方法 – Ilikeperl

回答

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+)部分,它寻找一个/,随后在至少一个非空白字符。

+0

非常感谢。您的方法适用于大多数情况(多个扩展名,有趣的字符),不包括空格。我会继续努力处理空白。谢谢你帮助我! – Ilikeperl

-1

如果只处理SHTXT文件,你可以这样做:

pattern = re.compile(r'\/(\w+\.(?:txt|sh))') 
+0

编辑:这是对现在删除的评论的回应:afaik'\ w'将匹配一个下划线/为我做。 – patrick

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'] 
相关问题