否定数字

时间:2019-04-15 19:02:54

标签: python python-3.x

我需要取反部分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))

1 个答案:

答案 0 :(得分:0)

  

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

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

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}\.:三位数字,后跟一个立即数,再后三位数字和一个后缀。
  • (?=\d{2}\.\d{1}):先查询两位数字,一个句点和一位数字。