Python打印(项目)不';不显示任何输出
在第一次Python打印(项目)不';不显示任何输出,python,regex,Python,Regex,在第一次打印(项目)时,我得到了我想要的结果。但是在第二个print(item),(查找IP的正则表达式)没有打印任何内容。我做错了什么 代码基本上是在文本文件中搜索其中的所有IP。 然后我尝试在显示ip之前添加一个字符串 txt文件: 我希望输出如下: IP Arp - ITF Omn-tool-A-192.168.0.1 IP Arp - ITF Omn-tool-A-192.168.0.2 IP Arp - ITF Omn-tool-
打印(项目)
时,我得到了我想要的结果。但是在第二个print(item)
,(查找IP的正则表达式)没有打印任何内容。我做错了什么
代码基本上是在文本文件中搜索其中的所有IP。
然后我尝试在显示ip之前添加一个字符串
txt文件:
我希望输出如下:
IP Arp - ITF Omn-tool-A-192.168.0.1
IP Arp - ITF Omn-tool-A-192.168.0.2
IP Arp - ITF Omn-tool-A-192.168.0.3
IP Arp - ITF Omn-tool-A-192.168.0.4
IP Arp - ITF Omn-tool-A-192.168.0.5
IP Arp - ITF Omn-tool-A-192.168.0.6
IP Arp - ITF Omn-tool-A-192.168.0.7
IP Arp - ITF Omn-b-192.168.0.8
IP Arp - ITF Omn-b-192.168.0.9
IP Arp - ITF Omn-b-192.168.0.10
IP Arp - ITF Omn-b-192.168.0.11
IP Arp - ITF Omn-b-192.168.0.12
IP Arp - ITF Omn-b-192.168.0.13
IP Arp - ITF Omn-b-192.168.0.14
IP Arp - ITF Omn-b-192.168.0.15
IP Arp - ITF Omn-b-192.168.0.16
IP Arp - ITF Omn-b-192.168.0.17
这是我的密码:
打开(Sw0,'r')作为f:
对于f中的第1行:
#如果在\u文件中:
line1=line1.拆分(“”)
对于第1行中的项目:
如果重新搜索(r'^[a-zA-Z]+\\\[a-zA-Z]+',项目):
匹配=重新搜索(r'[a-zA-Z]+\\\[a-zA-Z]+',项目)
data0.append(match.group(0))
对于f中的项目:
#节头
匹配=重新搜索(r'IP Arp[^Extn-]*-\s*(\w+),项)
如果匹配项不是无:
节=匹配。组(0)
打印(项目)
#打印(部分)
持续
对于f中的项目:
match=re.search(r'^\d+\.\d+\.\d+\.\d+',项)
打印(项目)
如果匹配项不是无:
data5.append({'section':section,'ip':match.group(0)})
打印(项目)
对于数据5中的d:
打印(“{}{}.”格式(d['section'],d['ip']))
您不需要读取文件f
两次。只需迭代一次,如果您找到一个报头,则更新当前报头并查找其下的所有IP地址。我们仍然可以在这里使用continue
返回到中的f行
查找标头时,因为不需要在当前行上搜索IP地址。此外,我们不需要一直呼叫re.search
。只需先检查它是否不是None
,然后调用.group(0)
我还认为^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
是搜索IPv4地址的更合适的模式,因为每个八位组只能有0到255之间的数字。我还使用了iparp.*
模式来查找报头,因为报头似乎需要以iparp
开头,并且任何字符/s都可以在它之后,因此出现了*
以下是您可以做的:
from re import search
with open("data.txt") as f:
header = None
for line in f:
header_match = search(r'IP Arp .*', line)
if header_match:
header = header_match.group(0)
continue
ip_address = search(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', line)
if ip_address:
print(f"{header}-{ip_address.group(0)}")
输出:
IP Arp - ITF Omn-tool-A-192.168.0.1
IP Arp - ITF Omn-tool-A-192.168.0.2
IP Arp - ITF Omn-tool-A-192.168.0.3
IP Arp - ITF Omn-tool-A-192.168.0.4
IP Arp - ITF Omn-tool-A-192.168.0.5
IP Arp - ITF Omn-tool-A-192.168.0.6
IP Arp - ITF Omn-tool-A-192.168.0.7
IP Arp - ITF Omn-b-192.168.0.8
IP Arp - ITF Omn-b-192.168.0.9
IP Arp - ITF Omn-b-192.168.0.10
IP Arp - ITF Omn-b-192.168.0.11
IP Arp - ITF Omn-b-192.168.0.12
IP Arp - ITF Omn-b-192.168.0.13
IP Arp - ITF Omn-b-192.168.0.14
IP Arp - ITF Omn-b-192.168.0.15
IP Arp - ITF Omn-b-192.168.0.16
IP Arp - ITF Omn-b-192.168.0.17
您不需要读取文件
f
两次。只需迭代一次,如果您找到一个报头,则更新当前报头并查找其下的所有IP地址。我们仍然可以在这里使用continue
返回到中的f行
查找标头时,因为不需要在当前行上搜索IP地址。此外,我们不需要一直呼叫re.search
。只需先检查它是否不是None
,然后调用.group(0)
我还认为^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
是搜索IPv4地址的更合适的模式,因为每个八位组只能有0到255之间的数字。我还使用了iparp.*
模式来查找报头,因为报头似乎需要以iparp
开头,并且任何字符/s都可以在它之后,因此出现了*
以下是您可以做的:
from re import search
with open("data.txt") as f:
header = None
for line in f:
header_match = search(r'IP Arp .*', line)
if header_match:
header = header_match.group(0)
continue
ip_address = search(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', line)
if ip_address:
print(f"{header}-{ip_address.group(0)}")
输出:
IP Arp - ITF Omn-tool-A-192.168.0.1
IP Arp - ITF Omn-tool-A-192.168.0.2
IP Arp - ITF Omn-tool-A-192.168.0.3
IP Arp - ITF Omn-tool-A-192.168.0.4
IP Arp - ITF Omn-tool-A-192.168.0.5
IP Arp - ITF Omn-tool-A-192.168.0.6
IP Arp - ITF Omn-tool-A-192.168.0.7
IP Arp - ITF Omn-b-192.168.0.8
IP Arp - ITF Omn-b-192.168.0.9
IP Arp - ITF Omn-b-192.168.0.10
IP Arp - ITF Omn-b-192.168.0.11
IP Arp - ITF Omn-b-192.168.0.12
IP Arp - ITF Omn-b-192.168.0.13
IP Arp - ITF Omn-b-192.168.0.14
IP Arp - ITF Omn-b-192.168.0.15
IP Arp - ITF Omn-b-192.168.0.16
IP Arp - ITF Omn-b-192.168.0.17
你读过两遍吗?f:s中的项有两个
。这似乎就是问题所在。另外,无需重复re.search
,使用m=re.search(…)
,然后如果m:print(m.group())
,则使用。您的意思是我不应该在“continue”之后的f:for中有一个for项吗。他没有打印任何想法,请在问题中加入代表性的输入样本。理想情况下,将从文件中读取的代码替换为一个更简单、最小的代码段,该代码段只处理一个静态字符串,而不是您想要的。另请参阅,特别是提供缩进的指南。这是代码的实际缩进吗?continue
是无保护的,在同一缩进级别上,它之后的所有代码都将被跳过。continue
中止当前循环迭代,并立即开始下一个循环迭代(对于f:
行中的项,它“跳回”到)。如果使用继续
,而不使用If
保护它,则在它运行后,不会有任何代码。为什么在这里使用continue
?是否阅读f
两次?f:
s中的项有两个。这似乎就是问题所在。另外,无需重复re.search
,使用m=re.search(…)
,然后如果m:print(m.group())
,则使用。您的意思是我不应该在“continue”之后的f:for中有一个for项吗。他没有打印任何想法,请在问题中加入代表性的输入样本。理想情况下,将从文件中读取的代码替换为一个更简单、最小的代码段,该代码段只处理一个静态字符串,而不是您想要的。另请参阅,特别是提供缩进的指南。这是代码的实际缩进吗?continue
是无保护的,在同一缩进级别上,它之后的所有代码都将被跳过。continue
中止当前循环迭代,并立即开始下一个循环迭代(对于f:
行中的项,它“跳回”到)。如果使用继续
,而不使用If
保护它,则在它运行后,不会有任何代码。为什么在这里使用continue
?它工作正常,但我如何将最终输出添加到名为data5的变量?好的,谢谢,我还有一个问题,它不允许我在“…Omn-b-192”上拆分,因为它是一个字符串,所以我无法导出它并将其添加到csv文件的两个不同单元格中。有没有我可以像“…Omn-b”,“192.168.0.17”那样拆分的字符串,所以我必须使用不同的字符串来处理csv文件?它工作得很好,但是如何