我需要否定部分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))
我已经尝试过以下代码,但是我得到一个空列表[]
相反,当我运行代码时,我得到以下内容:
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})
:预测两位数,一个句号,然后是一位数。