Python - 从字符串解析IPv4地址(即使在审查时)

nep*_*hos 5 python regex ipv4 data-extraction python-2.7

目标:编写Python 2.7代码以从字符串中提取IPv4地址.

字符串内容示例:


以下是IP地址:192.168.1.1,8.8.8.8,101.099.098.000.这些也可以显示为192.168.1 [.] 1或192.168.1(.)1或192.168.1 [dot] 1或192.168.1(dot)1或192 .168 .1 .1或192. 168. 1这些审查方法适用于任何一个点(例如:192 [.] 168 [.] 1 [.] 1).


正如你可以从上面看到的,我在努力寻找一种方法,通过可能包含在"审查"的多种形式描绘的IP地址一个txt文件解析(防止超链接).

我认为正则表达式是要走的路.也许会说些什么; 四个整数0-255或000-255的任何分组被任何东西在"分隔符列表",其将包括周期,支架,括号,或任何其他上述实施例的分离.这样,可以根据需要更新"分隔符列表".

不确定这是否是正确的方式,甚至可能,所以,非常感谢任何帮助.


更新: 感谢下面的递归回答,我现在有以下代码适用于上面的示例.它会...

  • 找到IP
  • 将它们放入列表中
  • 清理他们的空间/大括号/等
  • 并使用已清理的列表条目替换未清除的列表条目.

警告:下面的代码不考虑不正确/不有效的IP如192.168.0.256或192.168.1.2.3目前,它将丢弃后从上述6和3.如果它的第一个字节是无效的(例如:256.10.10.10),它会掉落领先2(导致56.10.10.10).

import re

def extractIPs(fileContent):
    pattern = r"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)([ (\[]?(\.|dot)[ )\]]?(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})"
    ips = [each[0] for each in re.findall(pattern, fileContent)]   
    for item in ips:
        location = ips.index(item)
        ip = re.sub("[ ()\[\]]", "", item)
        ip = re.sub("dot", ".", ip)
        ips.remove(item)
        ips.insert(location, ip) 
    return ips

myFile = open('***INSERT FILE PATH HERE***')
fileContent = myFile.read()

IPs = extractIPs(fileContent)
print "Original file content:\n{0}".format(fileContent)
print "--------------------------------"
print "Parsed results:\n{0}".format(IPs)
Run Code Online (Sandbox Code Playgroud)

rec*_*ive 8

这是一个有效的正则表达式:

import re
pattern = r"((([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])[ (\[]?(\.|dot)[ )\]]?){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]))"
text = "The following are IP addresses: 192.168.1.1, 8.8.8.8, 101.099.098.000. These can also appear as 192.168.1[.]1 or 192.168.1(.)1 or 192.168.1[dot]1 or 192.168.1(dot)1 or 192 .168 .1 .1 or 192. 168. 1. 1. "
ips = [match[0] for match in re.findall(pattern, text)]
print ips

# output: ['192.168.1.1', '8.8.8.8', '101.099.098.000', '192.168.1[.]1', '192.168.1(.)1', '192.168.1[dot]1', '192.168.1(dot)1', '192 .168 .1 .1', '192. 168. 1. 1']
Run Code Online (Sandbox Code Playgroud)

正则表达式有几个主要部分,我将在这里解释:

  • ([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])
    这匹配ip地址的数字部分. |意思是"或".第一种情况处理从0到199的数字,带或不带前导零.后两个案件处理的数字超过199.
  • [ (\[]?(\.|dot)[ )\]]?
    这与"点"部分匹配.有三个子组件:
    • [ (\[]?点的"前缀".空间,开放式支撑或开放式方形支撑.尾随?意味着此部分是可选的.
    • (\.|dot) "点"或句点.
    • [ )\]]?"后缀".与前缀相同的逻辑.
  • {3} 意味着重复前一个组件3次.
  • 最后一个元素是另一个数字,它与第一个元素相同,除了它后面没有一个点.

  • @recursive您是否介意解释该正则表达式的工作原理? (3认同)
  • 我认为问题的底部两段充分解释了 nephos 进展的当前状态。可能是没有代码,但是很明显已经投入了一些思想,所以没关系。由于有足够的信息来提供一个有希望的有用答案,我认为没有理由不这样做。 (2认同)
  • @recursive:我一直在考虑买车,你会为我买吗?我对此表示怀疑.**思考**解决方案和**尝试**它是两个不同的东西. (2认同)
  • @MadaraUchiha:我会告诉你如何买车。我实际上不会为此付出代价。同样,我会告诉你如何应用正则表达式,但我不会支持你的软件。 (2认同)
  • @BenjaminGruenbaum:我补充说明. (2认同)

nep*_*hos 1

下面的代码将...

  • 即使经过审查也能在字符串中查找 IP(例如:192.168.1[dot]20 或 10.10.10 .21)
  • 将它们放入列表中
  • 清除它们的审查制度(空格/大括号/括号)
  • 并将未清理的列表条目替换为已清理的列表条目。

注意:下面的代码不考虑不正确/无效的 IP,例如 192.168.0.256 或 192.168.1.2.3 目前,它将删除尾随数字(上述的 6 和 3)。如果其第一个八位字节无效(例如:256.10.10.10),它将删除前导数字(结果为 56.10.10.10)。


import re

def extractIPs(fileContent):
    pattern = r"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)([ (\[]?(\.|dot)[ )\]]?(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})"
    ips = [each[0] for each in re.findall(pattern, fileContent)]   
    for item in ips:
        location = ips.index(item)
        ip = re.sub("[ ()\[\]]", "", item)
        ip = re.sub("dot", ".", ip)
        ips.remove(item)
        ips.insert(location, ip) 
    return ips


myFile = open('***INSERT FILE PATH HERE***')
fileContent = myFile.read()

IPs = extractIPs(fileContent)
print "Original file content:\n{0}".format(fileContent)
print "--------------------------------"
print "Parsed results:\n{0}".format(IPs)
Run Code Online (Sandbox Code Playgroud)

Run Code Online (Sandbox Code Playgroud)