Python正则表达式匹配整个文件名包含文件扩展名
我想从标准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'
什么应该是正确的正则表达式匹配文件名包含文件扩展名?
你可以使用一个列表理解一个简单的正则表达式:
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+)
部分,它寻找一个/
,随后在至少一个非空白字符。
非常感谢。您的方法适用于大多数情况(多个扩展名,有趣的字符),不包括空格。我会继续努力处理空白。谢谢你帮助我! – Ilikeperl
如果只处理SH和TXT文件,你可以这样做:
pattern = re.compile(r'\/(\w+\.(?:txt|sh))')
编辑:这是对现在删除的评论的回应:afaik'\ w'将匹配一个下划线/为我做。 – patrick
您可以使用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']
不要尝试正则表达式匹配文件名。那么空间呢?其他有趣的角色呢,都是由本地文件系统所允许的?怎么样多个'.ext.ens.ions'?取而代之的是将部件匹配到“18593420”,然后匹配一组'。+',然后匹配'b_i r user1 ftp 0 * c'-part。 – user2722968
@ user2722968感谢提醒。是的,空白空间应该是一个问题。我会尝试另一种方法 – Ilikeperl