【问题标题】:Censoring strings in file using regex in python在python中使用正则表达式审查文件中的字符串
【发布时间】:2018-01-24 14:39:25
【问题描述】:

我使用 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 个)时,此代码需要很长时间才能运行。

对于执行相同过程的更有效方法有什么建议吗?

【问题讨论】:

  • 我建议您分析您的代码以找出瓶颈所在。

标签: python regex file replace


【解决方案1】:

您可以尝试设置线程池并使用多线程来提高性能。下面的链接很好地向您介绍了 python 的基础知识:

http://chriskiehl.com/article/parallelism-in-one-line/

您可以将并行性放在多个位置。你必须玩最适合你的东西。将每个文件视为一个独特的过程可能会更有效,或者将它放在单独检查每一行的过程中可能会更好。

但是,您可以加快速度的最后一种方法是避免逐行执行。相反,将正则表达式放在整个文件上并立即替换所有匹配项。 @Idlehands 答案对此提供了更多详细信息。

【讨论】:

    【解决方案2】:

    可能只是微小的改进:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2014-07-28
      • 2016-01-10
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多