数字否定

问题描述 投票:0回答:1

我需要否定部分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))
python python-3.x
1个回答
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}\.:三位数后跟一个文字句点,然后是另外3位数和一个文字句号。
  • (?=\d{2}\.\d{1}):预测两位数,一个句号,然后是一位数。
© www.soinside.com 2019 - 2024. All rights reserved.