Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用正则表达式审查文件中的字符串_Python_Regex_File_Replace - Fatal编程技术网

在python中使用正则表达式审查文件中的字符串

在python中使用正则表达式审查文件中的字符串,python,regex,file,replace,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.

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


任何关于更有效地执行相同流程的建议?

可能只是一个小小的改进:

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
输出:

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

可能只是一个微小的改进:

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
输出:

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

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

可以将平行度放在多个点上。你必须用对你最有效的方法。将每个文件视为一个唯一的过程可能更有效,或者最好将其放在单独检查每一行的过程中


然而,最后一种加速的方法是避免逐行进行。相反,将正则表达式放在整个文件上,并立即替换所有匹配项@Idlehands的回答给出了更多的细节

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

可以将平行度放在多个点上。你必须用对你最有效的方法。将每个文件视为一个唯一的过程可能更有效,或者最好将其放在单独检查每一行的过程中


然而,最后一种加速的方法是避免逐行进行。相反,将正则表达式放在整个文件上,并立即替换所有匹配项@Idlehands的回答给出了更多的细节

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