使用python

时间:2018-01-24 14:39:26

标签: python regex file replace

我使用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个)时,此代码需要花费大量时间。

是否建议采用更有效的方法来执行相同的流程?

2 个答案:

答案 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是消除处理时间的关键