【发布时间】:2013-06-24 01:19:19
【问题描述】:
目标:编写 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 . 1. 这些审查方法可以适用于任何一个点(例如:192[.]168[.]1[.]1)。
正如您从上面看到的,我正在努力寻找一种方法来解析一个 txt 文件,该文件可能包含以多种“审查”形式描述的 IP(以防止超链接)。
我认为正则表达式是要走的路。也许说一些类似的东西;由“分隔符列表”中的任何内容分隔的四个整数 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)
【问题讨论】:
-
很高兴发布您到目前为止所尝试的内容以及您遇到的问题。这样我们可以改进您当前的解决方案,您可以从中学习(更多)
-
起初我在空格上进行拆分,并且几乎所有东西都可以正常工作,但是在我意识到有时空格会在句点前面加上之后,我又回到了绘图板上。到目前为止,我已经尝试了 StackOverflow 中的许多不同示例,但只找到了获取“未经审查”IP 的方法。例如,我尝试拆分句点,然后验证每个元素 (re.match(r'^([01]?[0-9]?[0-9]|2[0-4][0-9] |25[0-5])$', part) 我以前从来没有玩过正则表达式,而且对 python 有点陌生,所以我对如何处理这个问题有点害怕。
-
recursive 提供了答案。我对help vampires 有点过敏,因此是我的反应。如果你早点回复我本可以回复你的:)
-
HamZa 不用担心。我很感激并理解“帮助吸血鬼”。我可能会遇到这种情况,因为我没有接受过正式的编程培训(阅读“完全菜鸟”),因此有时会遇到愚蠢的问题或需要指向正确方向的指针才能在我的脑海中形成它。递归非常有用,我现在几乎完成了我的代码。
-
@HamZa 很高兴知道。谢谢。
标签: python regex python-2.7 ipv4 data-extraction