【发布时间】:2018-12-01 10:30:25
【问题描述】:
我有一个存储在文本文件中的 IP 列表以及一些其他数据,我试图从中仅对有效 IP 进行 grep。在这里,我有一些 IP,例如 0.0.0.0 和 localhost IP(以 127 开头......),我试图使用正则表达式来消除它们。 这是我想出的过滤 0.0.0.0 IP 但无法有效删除 127..* IP 的正则表达式模式。
import re
with open("data","r") as f:
for line in f:
test = re.search(r'(?!0|127)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', line)
if test:
print(test.group(0))
IP 位于文本文件中,如下所示:
127.3.65.7
alkjgfbvui vluiybr vk ru r127.0.0.1fal;iufnaw waoun
12.0.1.5
mjhgvjg0.0.0.0kjuycuj
0.0.0.0
0.0.0.0
gare bloing r pgnao wyin212.2.174.64
207.71.31.224
awuie nvp; vwa rv;awiu n ;lkirjght94.206.93.104ta;wourit mrt'
172.20.128.1
172.20.164.207
172.20.164.203
172.20.164.209
1.8.0.144
我得到以下输出,您可以看到以 127 开头的 IP 也是通过删除第一个数字“1”来打印的
27.3.65.7
27.0.0.1
12.0.1.5
212.2.174.64
207.71.31.224
94.206.93.104
172.20.128.1
172.20.164.207
172.20.164.203
172.20.164.209
1.8.0.144
【问题讨论】:
-
或者,只需捕获所有 IP(v4),然后与要排除的 IP(v4) 进行比较。另外,
127.0.0.42呢? -
@user2864740 编辑了问题 必须消除 localhost 范围内的所有 IP。问题是,我最初是从 1000 个文件中读取的,因此我将将近 5000 个 IP 存储在一个 csv 文件中。如果您比较所有这些 IP 的正则表达式匹配,它的时间复杂度。
-
5000 是一个很小的数字 ~ 0 次对计算机来说如此快速的操作。性能瓶颈(如果有的话)可能在其他地方,比如实际的 IO 读取。此外,如果没有测试和测量 实际 性能,我没有理由相信正则表达式 [向后看] 比正则表达式 + 警卫更快/相关。附言我的新电脑有 4 个内核,所有内核都以每秒 34 亿次的速度“滴答”。
-
@user2864740 是的。考虑到计算能力,5000 是很小的数字。但是,如果我解析的那 1000 个文件很大(数百 MB)来抓取 IP 怎么办?我有 html、.pp、json、xml、Readme.md 等类型的文件。我需要一些高效的文件。在 5000 个 IP 中,只有大约 300 个 IP 在 127...范围内。为此,我不想比较其他 4000 个 IP
-
与这个“性能”问题无关。你花了更多的时间写最后一条评论,然后是成千上万(甚至可能是几十万)数千个这样的检查。此外,它是程序方案中 a/the 性能问题的可能性:大约 0。没有实际性能数据,甚至没有相关经验和案例支持,试图“优化”是没有意义的这样的努力。
标签: python regex python-3.x python-2.7 ip-address