我使用python打开文件并替换特定的正则表达式模式。 我有一个文件列表,以及需要审查的模式/字符串列表。
目前,我正在迭代每个文件和每个文件中的每一行,检查模式是否匹配,如果是,请将其替换为:
# Removing all IP and patterns
for logPath in createdLogs:
file = fileinput.FileInput(logPath, inplace=True)
for line in file:
line = re.sub("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",
"XXX.XXX.XXX.XXX",
line.rstrip()) # Censoring IPs
for pattern in patterns:
line = re.sub(pattern, "HIDDEN-TEXT", line.rstrip()) # Censoring other patterns
print line
file.close()
问题在于效率。迭代超过5个文件(大约15-20个)时,此代码需要花费大量时间。
是否建议采用更有效的方法来执行相同的流程?
答案 0 :(得分:2)
您可以尝试设置线程池并使用多线程来提高性能。下面的链接可以很好地向您介绍python的基础知识:
http://chriskiehl.com/article/parallelism-in-one-line/
你可以将并行性放在多个位置。你必须玩最适合你的东西。将每个文件视为一个独特的过程可能更有效,或者最好将它放在单独检查每一行的过程中。
然而,最后一种方法是加快速度,避免逐行。相反,将正则表达式放在整个文件上并立即替换所有匹配项。 @Idlehands的答案提供了更多细节。
答案 1 :(得分:1)
可能只是一个微小的改进:
patterns = {"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}": "XXX.XXX.XXX.XXX", "http://[\w.:]+": "HIDDEN-TEXT"}
for logPath in createdLogs:
file = fileinput.FileInput(logPath, inplace=True)
lines = ''.join(file.readlines())
for pattern, new_text in patterns.items():
lines = re.sub(pattern, new_text, lines)
print(lines)
file.close()
<强>输入强>
foo 127.0.0.1 http://localhost:8080 bar
foo 192.168.1.1 http://my.router.com bar
foo 192.168.1.100 http://my.computer.net bar
foo 192.168.100.1 foo.bar bar
foo 255.255.255.0 default.gateway.dns bar
foo 172.217.0.228 www.google.com bar
foo 151.101.65.69 www.stackoverflow.com bar
<强>输出:强>
foo XXX.XXX.XXX.XXX HIDDEN-TEXT bar
foo XXX.XXX.XXX.XXX HIDDEN-TEXT bar
foo XXX.XXX.XXX.XXX HIDDEN-TEXT bar
foo XXX.XXX.XXX.XXX foo.bar bar
foo XXX.XXX.XXX.XXX default.gateway.dns bar
foo XXX.XXX.XXX.XXX www.google.com bar
foo XXX.XXX.XXX.XXX www.stackoverflow.com bar
<强>的变化:强>
1.)预先定义所有模式并替换字典中的文本
2.)迭代所有模式,而不是单独审查IP
3.)而不是每行检查,每个文件只对每个模式执行一次re.sub()
。
如果有的话,我认为#3是消除处理时间的关键