【问题标题】:How do I iterate and match an IP against IP ranges (cidr) in python?如何在python中迭代和匹配IP与IP范围(cidr)?
【发布时间】:2020-01-31 13:21:51
【问题描述】:

我有一个带有'State' 的表,并且关联的 IP CIDR 范围与该状态关联。

表 A

--------------------------------------------------
| ID         | State       | IP_subnet           |
--------------------------------------------------
| 1          |      CA     |    192.168.1.0/24   |
--------------------------------------------------
| 2          |      TX     |    172.68.7.0/24    |
--------------------------------------------------
| 3          |      NY     |    61.141.47.0/24   |
--------------------------------------------------

我想遍历下表并将IP 字段与IP_subnet 字段匹配。

表 B

| ID         |          IP           | 
--------------------------------------
| 1          |      61.141.47.1      |
--------------------------------------
| 2          |      192.168.1.48     | 
--------------------------------------
| 3          |      172.68.7.124     |
--------------------------------------
| 4          |      40.32.123.212    |
--------------------------------------

以下是我想要的结果:(将关联的StateIP 匹配)

| ID         |          IP           |      State  |
--------------------------------------------------
| 1          |      61.141.47.1      |      null   |
--------------------------------------------------
| 2          |      192.168.1.48     |      CA     |
--------------------------------------------------
| 3          |      172.68.7.124     |      TX     |
--------------------------------------------------
| 4          |      40.32.123.212    |      NY     |
--------------------------------------------------

我知道下面的代码适用于 1 个值。如何遍历 IPs 列与另一个列?

from ipaddress import IPv4Address, IPv4Network

IPv4Address('172.68.7.124') in IPv4Network('172.68.7.0/24')

仅供参考

  • 192.168.1.0/24 == 范围 [192.168.1.0 TO 192.168.1.255]
  • 172.68.7.0/24 == 范围 [172.68.7.0 TO 172.68.7.255]

初始化列表列表

数据 = [[1, 'CA', '192.168.1.0/24'], [2, 'TX', '172.68.7.0/24'], ['juli', 14], [3, NY , 61.141.47.0/24]]

创建熊猫数据框

df = pd.DataFrame(data, columns = ['ID', 'State', 'IP_subnet'])

【问题讨论】:

  • 你的表数据在python中是如何存储的?它是熊猫数据框吗?
  • 是的,它在熊猫中
  • @whodat 将 df 数据发布为 pandas 结果而不是字符串生成的表格
  • @ZarakiKenpachi 我还没有真正编码过这个。我将这个概念放在那里,以寻求有关如何处理它的帮助。请帮忙
  • @whodat 首先阅读此pandas.pydata.org/pandas-docs/stable/getting_started/10min.html 并将您的数据转换为 pandas df

标签: python loops ip pattern-matching match


【解决方案1】:

首先使用 2 个数据帧为每个 IP 查找状态,然后根据此字典数据创建新列并加载到原始 df 中。

我认为它可以以更紧凑的方式完成,但它仍然可以完成工作。

import pandas as pd

data = [[1, 'CA', '192.168.1.0/24'], [2, 'TX', '172.68.7.0/24'], [3, 'NY', '61.141.47.0/24']]
df = pd.DataFrame(data, columns=['ID', 'State', 'IP_subnet'])
# replace end of IP
df['IP_subnet'] = df['IP_subnet'].str.replace(r'.0/24', '')

data2 = [[1, '61.141.47.1'], [2, '192.168.1.48'], [3, '172.68.7.124'], [4, '40.32.123.212']]
df2 = pd.DataFrame(data2, columns=['ID', 'IP'])

# match IP with state
data = {}
for index, row in df.iterrows():
    ww = df2[df2['IP'].str.contains(row['IP_subnet'])]
    data[ww['IP'].values[0]] = row['State']

# create State column
state_data = []
for index, row in df2.iterrows():
    if row['IP'] in data:
        state_data.append(data.get(row['IP']))
    else:
        state_data.append('NaN')

df2['State'] = state_data

输出:

   ID             IP State
0   1    61.141.47.1    NY
1   2   192.168.1.48    CA
2   3   172.68.7.124    TX
3   4  40.32.123.212   NaN

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 2023-04-05
    • 2011-02-11
    • 1970-01-01
    • 2018-11-01
    • 2013-04-20
    • 2017-01-14
    • 2012-11-04
    • 2012-11-10
    相关资源
    最近更新 更多