我想从标准的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'
正确的正则表达式应该与文件名匹配,包括文件扩展名吗?
答案 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