首页 > 解决方案 > 数字取反

问题描述

我需要取反部分 IP 地址并仅获取最后两个八位字节,例如:

IP_Add1 192.168.10.1 LAN 10

我只想要 IP Add (10.1) 的最后两个八位字节,所以我需要我的输出如下所示:

IP_Add1 10.1 LAN 10

我已经尝试过使用以下代码,但结果是一个空列表 []。有什么帮助吗?

str_2 = '''IP_Add1 192.168.10.1 LAN 10
IP_Add1 192.168.10.1 LAN 20
IP_Add1 192.168.20.1 LAN 30
IP_Add1 192.168.30.1 LAN 40
'''

print(re.findall(r"\w+ [\d]{3}.[\d]{3}.[\d]{2}.[\d]{1}", str_2))

标签: pythonpython-3.x

解决方案


我已经尝试过使用以下代码,但我得到一个空列表 []

相反,当我运行你的代码时,我得到以下信息:

import re
str_2 = '''IP_Add1 192.168.10.1 LAN 10
IP_Add1 192.168.10.1 LAN 20
IP_Add1 192.168.20.1 LAN 30
IP_Add1 192.168.30.1 LAN 40
'''

print(re.findall(r"\w+ [\d]{3}.[\d]{3}.[\d]{2}.[\d]{1}", str_2))
#['IP_Add1 192.168.10.1', 'IP_Add1 192.168.10.1', 'IP_Add1 192.168.20.1', 'IP_Add1 192.168.30.1']

这是因为re.findall将:

返回字符串中所有非重叠匹配的列表。

但是根据您的措辞,您真正想做的事情最好使用以下方法完成re.sub

res = re.sub(r"(?<=IP_Add\d )\d{3}\.\d{3}\.(?=\d{2}\.\d{1})", "", str_2)
print(res)
#IP_Add1 10.1 LAN 10
#IP_Add1 10.1 LAN 20
#IP_Add1 20.1 LAN 30
#IP_Add1 30.1 LAN 40

如果您希望您的结果在列表中,您可以调用该splitlines()方法:

print(res.splitlines())
#['IP_Add1 10.1 LAN 10',
# 'IP_Add1 10.1 LAN 20',
# 'IP_Add1 20.1 LAN 30',
# 'IP_Add1 30.1 LAN 40']

中使用的正则表达式模式sub如下:

  • (?<=IP_Add\d )"IP_Add":后跟一个数字和一个空格的文字字符串
  • \d{3}\.\d{3}\.:三位数字后跟一个文字句点,然后是另外 3 位数字和一个文字句点。
  • (?=\d{2}\.\d{1}): 前瞻两位数,一个句点,然后一位数。

推荐阅读