如何摆脱 None 输入我的输出 - 我只想 select 有效的 IP 地址

How to get rid of None Type in my output - I only want to select valid IP addresses

知道如何不使用 None 包含任何内容吗?我现在正尝试只提取 IP 地址,但我不想包含空元素。

我的API回复

[{'name': '', 'serial': 'Q2KN-xxxx-438Z', 'mac': '0c:8d:db:c3:ad:c8', 'networkId': 'L_6575255xxx96096977', 'model': 'MX64', 'address': '', 'lat': 38.4180951010362, 'lng': -92.098531723022, 'notes': '', 'tags': '', 'wan1Ip': '47.134.13.195', 'wan2Ip': None}, {'name': '', 'serial': 'Q2PD-xxx-QQ9Y', 'mac': '0c:8d:db:dc:ed:f6', 'networkId': 'L_657525545596096977', 'model': 'MR33', 'address': '', 'lat': 38.4180951010362, 'lng': -92.098531723022, 'notes': '', 'tags': '', 'lanIp': '10.0.0.214'}]

遍历元素并select访问某些字段

response = requests.request("GET", url + id + '/devices', headers=headers)
data = response.json()
for item in data:
  keys = [item.get(x) for x in ['wan1Ip', 'model', 'lanIp', 'wan2Ip']]
  print(*keys, sep="\n", file=sys.stdout)

我的输出是:

47.134.13.195
MX64
None
None
None
MR33
10.0.0.214
None

我想要的输出是:

47.134.13.195
10.0.0.214

我试过为 IP 地址添加 re.findall,但不确定这是否适合我。我还尝试为 not in None 和其他一些东西添加运算符。

re.findall(“(?:[\d]{1,3}).(?:[\d]{1,3}).(?:[\d]{1, 3}).(?:[\d]{1,3})?“,string2 )

更新 我已将线路更改为 keys = [item.get(x) for x in ['wan1Ip', 'model', 'lanIp', 'wan2Ip', '{}']if x in item]

显然,我的输出中仍然有非 IP 地址,但我可以 select 只有 IP 地址的元素。我的主要问题是 None。我也会尝试其他一些建议。

在您的列表理解中添加一个过滤器,以检查键 x 是否在 item.

for item in data:
  keys = [item.get(x) for x in ['wan1Ip', 'model', 'lanIp', 'wan2Ip'] if x in item]
  print(*keys, sep="\n", file=sys.stdout)

使用正则表达式() 搜索每个密钥 ipv4 并检查密钥是 None 使用 item.get(x) or ''

import re

myRegex = re.compile(r'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b')
# data here

for item in data:

    keys = [item.get(x) for x in ['wan1Ip', 'model', 'lanIp', 'wan2Ip'] if myRegex.search(item.get(x) or '')]
    print(*keys, sep="\n", file=sys.stdout)

您可以将此条件添加到列表理解的末尾:

keys = [item.get(x) for x in ['wan1Ip', 'model', 'lanIp', 'wan2Ip'] if item.get(x) is not None]

输出将是你想要的。

你能试试这个吗:

    >> data = response.json()
    >> keys = [x.get(key) for key in ['wan1Ip', 'model', 'lanIp', 'wan2Ip'] for x in data if x.get(key)]
    >> print(keys)
    >> ['47.134.13.195', 'MX64', 'MR33', '10.0.0.214']