加入多个正则表达式的输出

时间:2016-12-03 16:01:24

标签: python regex join

我有一个来自防火墙的txt格式的日志文件,例如:

src=10.10.10.1 srcPort=15003 dst=20.20.20.1 service=443 host=FirewalName proto=tcp
src=30.30.30.1 srcPort=18003 dst=40.40.40.1 service=8080 host=FirewalName proto=tcp

我已经构建了正则表达式来提取我需要的信息(src,dst,service),但是我需要能够加入正则表达式的输出并将输出写入文件,每个文件夹之间有一个选项卡。每个service = object之前的“TCP”,对于日志文件中的每一行,所以新文件的输出如下所示:

10.10.10.1    20.20.20.1    TCP 443
30.30.30.1    40.40.40.1    TCP 8080

另外,我需要能够区分输入文件的service =部分中的“TCP”和“UDP”,以便写入输出文件的内容正确示例:如果输入文件的第三行是:

src=50.50.50.1 srcPort=21003 dst=60.60.60.1 service=161 host=FirewalName proto=udp

我被困在这里需要帮助。

import re
import sys

with open("SFD-IPs.txt", "r") as file:
    text = file.read()

sources = re.findall(r'src=(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', text)
dest = re.findall(r'dst=(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', text)
service = re.findall(r'service=(\d+)', text)


with open("output.txt", "w") as TufinReq:
    TufinReq.write(sIP)

f=open("output.txt", "r")
del_list = ["src=", "dst=", "service="]
list = []
for line in f:
    for word in del_list:
        if word in line:
            line = line.replace(word, "")
    list.append(line)
f.close()
f=open("output.txt", "w+")
for line in list:
    f.write(line)
f.close()

2 个答案:

答案 0 :(得分:1)

首先,您需要拆分sourcesdest的每个项目以检索所需的数据,如下所示:

sources = [item.split('=')[1] for item in sources]
dest = [item.split('=')[1] for item in dest]

现在您可以使用zip()内置函数,如下所示:

with open('output.txt', 'w') as f:
    for item in zip(sources, dest, service):
        f.write('{}\t{}\tTCP\t{}\n'.format(*item))

如果您还要添加协议,您可以执行以下操作:

proto = re.findall(r'proto=(\w+)', text)
proto = [item.upper() for item in proto]

with open('output.txt', 'w') as f:
    for item in zip(sources, dest, proto, service):
        f.write('{}\t{}\t{}\t{}\n'.format(*item))

<强>输出:

output.txt文件的内容:

text = '''src=10.10.10.1 srcPort=15003 dst=20.20.20.1 service=443 host=FirewalName proto=tcp
src=30.30.30.1 srcPort=18003 dst=40.40.40.1 service=8080 host=FirewalName proto=tcp
src=50.50.50.1 srcPort=21003 dst=60.60.60.1 service=161 host=FirewalName proto=udp'''

是这样的:

10.10.10.1  20.20.20.1  TCP 443
30.30.30.1  40.40.40.1  TCP 8080
50.50.50.1  60.60.60.1  UDP 161

答案 1 :(得分:0)

你可以用一个正则表达式搜索完成这个并用一个更简单的模式替换。

正则表达式:

src=([\d\.]+).*dst=([\d\.]+).*service=(\d+).*proto=(.*)

替换字符串:

$1    $2    $4 $3

demo