Python IP解析

Python IP解析,python,parsing,ip,Python,Parsing,Ip,我正在使用SIEM,需要能够解析相对较大文件中的IP地址。它们没有一致的字段,因此不能选择剪切。我正在使用一个修改过的python脚本删除除a-z a-z 0-9和句点之外的所有字符。以便可以正确解析该文件。问题是这不适用于我的SIEM文件。如果我有一个类似于192.168.1.2!@$!@%@$的文本文件这很好,它将正确地删除我不需要的所有字符,并将IP输出到一个新文件中。问题是,如果文件看起来像192.168.168.168@$%这样,这是一个测试,在删除异常字符的第一阶段之后,它将不受影响

我正在使用SIEM,需要能够解析相对较大文件中的IP地址。它们没有一致的字段,因此不能选择剪切。我正在使用一个修改过的python脚本删除除a-z a-z 0-9和句点之外的所有字符。以便可以正确解析该文件。问题是这不适用于我的SIEM文件。如果我有一个类似于192.168.1.2!@$!@%@$的文本文件这很好,它将正确地删除我不需要的所有字符,并将IP输出到一个新文件中。问题是,如果文件看起来像192.168.168.168@$%这样,这是一个测试,在删除异常字符的第一阶段之后,它将不受影响。请帮忙,我不知道它为什么会这样。这是我的密码:

    #!/usr/bin/python
    import re
    import sys

    unmodded = raw_input("Please enter the file to parse. Example: /home/aaron/ipcheck: ")
    string = open(unmodded).read()
    new_str = re.sub('[^a-zA-Z0-9.\n\.]', ' ', string)
    open('modifiedipcheck.txt', 'w').write(new_str)

    try:
        file = open('modifiedipcheck.txt', "r")
        ips = []
        for text in file.readlines():
            text = text.rstrip()
            regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:    [\d]{1,3})$',text)
            if regex is not None and regex not in ips:
                ips.append(regex)
         for ip in ips:
            outfile = open("checkips", "a")
            combine = "".join(ip)
            if combine is not '':
                print "IP: %s" % (combine)
                outfile.write(combine)
                outfile.write("\n")
     finally:
            file.close()
            outfile.close()
有人有什么想法吗?提前非常感谢。

您的正则表达式以$结尾,这表示它希望该行在该点结束。如果删除该选项,它应该可以正常工作:

regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', text)
您还可以进一步简化正则表达式本身:

regex = re.findall(r'(?:\d{1,3}\.){3}\d{1,3}', text)
您的正则表达式以$结尾,这表示它希望该行在该点结束。如果删除该选项,它应该可以正常工作:

regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', text)
您还可以进一步简化正则表达式本身:

regex = re.findall(r'(?:\d{1,3}\.){3}\d{1,3}', text)

以下是我认为正在发生的事情。您有一个查找垃圾字符并用空格替换它们的模式。当IP地址后跟垃圾时,垃圾将变为空格,当去掉字符串时,空格将消失,只留下要匹配的地址

您的模式以$结尾,因此它被锚定到行的末尾,因此当地址是行上的最后一个内容时,它将匹配


当您进行这是一个测试时,会有一些非垃圾字符被单独保留,strip不会删除它们,然后$表示IP地址不匹配。

我认为是这样的。您有一个查找垃圾字符并用空格替换它们的模式。当IP地址后跟垃圾时,垃圾将变为空格,当去掉字符串时,空格将消失,只留下要匹配的地址

您的模式以$结尾,因此它被锚定到行的末尾,因此当地址是行上的最后一个内容时,它将匹配


当你有一个测试,然后有非垃圾字符是单独的,条不删除它们,那么$意味着IP地址不匹配。

此外,你可能想考虑使用OpenBLA,“R”作为文件,而不是尝试/最后条款,第二个是缩进一个空间太远,虽然在这种情况下并不重要,但是应该考虑适当地缩进它,以防止在扩展该代码时出现恼人的错误。嘿,抱歉,它只是从复制和粘贴中错误地缩进,在我的编辑器中它是好的:而且,您可能想考虑使用OpenBLA来使用。“R”作为文件,而不是Test/FEXT子句。第二个是缩进一个空间太远,虽然在这种情况下并不重要,但是无论如何都应该考虑缩进它,以防止在扩展该代码时出现恼人的错误。嘿,抱歉,它只是从复制和粘贴中错误地缩进,在我的编辑器中它的好处是:但在那之后,它仍然在第一个IP之后停止。所以如果我有192.168.1.1!@!@这是一个测试192.168.23.23,它将只输出第一个IP,而忽略第二个IP。对不起,太晚了,所以我可能错过了一些小事情。尽管.NVM目前工作正常,但仍非常感谢您的帮助。它只是在输出文件中没有空格的情况下将所有内容串在一起。如果您还没有修复它,您可以使用\n.joinip而不是.joinip,因此它会在IP之间引入换行符。然后,您可以将字符串写入一个文件,而无需进一步考虑。这是可行的,但在第一个IP之后,它仍然会停止。所以如果我有192.168.1.1!@!@这是一个测试192.168.23.23,它将只输出第一个IP,而忽略第二个IP。对不起,太晚了,所以我可能错过了一些小事情。尽管.NVM目前工作正常,但仍非常感谢您的帮助。它只是在输出文件中没有空格的情况下将所有内容串在一起。如果您还没有修复它,您可以使用\n.joinip而不是.joinip,因此它会在IP之间引入换行符。然后你就可以把字符串写进一个文件,而不需要任何进一步的考虑。嘿,是的,这就是问题所在。删除$character修复了这个问题,但在拉取第一个IP后仍然会停止。嘿,是的,这就是问题所在。删除$字符修复了它,除非它在拉取第一个IP后仍然停止。