在python中使用正则表达式审查文件中的字符串
我使用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.
# 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的回答给出了更多的细节 我建议您分析代码以找出瓶颈所在。我建议您分析代码以找出瓶颈所在。