首页 > 解决方案 > Python re 模块在使用 findall 时返回空白条目

问题描述

我正在尝试编写一个 python 程序来解析日志文件并.js从中获取文件名。该脚本似乎可以识别空白以及文件。不知道为什么...

import re

_logf = open('access_log.txt')
_list = []
_uniq = []

for line in _logf:        
    _list.append(re.findall(r'[^/]*\.js',line))

for item in _list:
    if item not in _uniq:
        _uniq.append(item)

print(sorted(_uniq))

输出的列表包含一个空列表,如下所示。我尝试添加+到正则表达式而不是*,但输出仍然相同。

[[], ['jquery.js'], ['jquery.jshowoff.min.js'], ['jquery.jshowoff2.js']]

标签: pythonregex

解决方案


_line无论命中与否,您都将附加到。仅_list在您受到打击时附加到:

found = re.findall(r'[^/]*\.js',line)

if found:
    _list.append(found)

此外,关于唯一性的第二部分可能可以作为一个集合来实现:

unique = set(_list)

.. 您当前的实现搜索整个列表(或至少直到命中)每个插入,随着条目数量开始增加,这是非常低效的。

您也可以通过仅使用文件名本身作为字典中的键来实现它,然后调用name_of_dict.keys()以仅获取键(这将是唯一的)。dict 是一个哈希表,这意味着在大多数情况下插入是 O(1) - 即常量,而不是取决于字典的大小(这in将用于列表)。


推荐阅读