Python正则表达式在列表中只找到一项,而不是全部



我有一个小Python脚本,它调用一个配置文件和一个列表。该列表用作搜索配置文件的模式。列表只是IP地址脚本运行,但它只找到列表上的第一个IP,而不是遍历每个IP来搜索配置。

有人能告诉我我缺了什么吗?我试图调用一个函数,但它仍然只找到列表中的第一个IP。

import re
list=['10.100.81.118',
'10.100.81.113',
'10.100.81.112',
'10.100.81.117',
'10.100.81.9',
'10.100.81.116',
'10.100.81.114',
'10.100.81.115',
'10.100.81.111',
'10.100.81.10',
'10.100.81.1']
config=open('show_run.txt','r')
for items in list:
for answers in config:
re2 = re.findall(items, answers, re.MULTILINE)
if re2:
print('n'.join(re2))

如@DaveSomeWhere所述,如果不读取文件数据,则需要将文件重置到每个循环中的初始位置。

因此,您可以将文件内容读取到一个变量中,然后在其中查找匹配项。

import re
ip_list=['10.100.81.118', '10.100.81.113', '10.100.81.112',
'10.100.81.117', '10.100.81.9', '10.100.81.116',
'10.100.81.114', '10.100.81.115', '10.100.81.111',
'10.100.81.10', '10.100.81.1']
config= open('show_run.txt', 'r')
configdata = config.read()
for items in ip_list:
re2 = re.findall(items, configdata, re.MULTILINE)
if re2:
print('n'.join(re2))

或者简单地说,你可以在没有重新模块的情况下做到这一点:

for items in ip_list:
if items in configdata:
print('n'.join(items))
Regex实际上可以帮助您同时搜索列表中的所有项目:
import re
my_list = ['10.100.81.118', '10.100.81.113', '10.100.81.112',
'10.100.81.117', '10.100.81.9', '10.100.81.116',
'10.100.81.114', '10.100.81.115', '10.100.81.111',
'10.100.81.10', '10.100.81.1']
pattern = r'({})'.format('|'.join(my_list))
print (pattern)
example1 = 'this is an ip address: 10.100.81.9 10.100.81.9 and this is another: 10.100.81.113'
example2 = 'this is an ip address: 10.100.81.10 and this is another: 10.100.81.113'
config = [example1, example2]
for answers in config:
res = re.findall(pattern, answers)
print (res)

最新更新