如何摆脱 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']
知道如何不使用 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']