这是我当前的代码,但我不完全确定如何使用搜索结果附加列表。如果有人能提供任何帮助,我们将不胜感激。
import sys
import re
with open('text.log') as f:
z=[]
count = 0
match = re.compile(r'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(.?)$')
for l in f:
if match.search(l):
z = l.strip().split("\t")[5:8]
z.pop(1)
print(z[1]) # Now print them
print('\n')
count += 1
if count == 20:
print("\n\n\n\n\n-----NEW GROUPING OF 20 RESULTS-----\n\n\n\n\n\n")
count = 0
else:
print('wrong')
sys.exit()
答案 0 :(得分:0)
一些想法:
1)每当您对正则表达式有疑问时,您都可以使用Python Regex Tool Site之类的工具来确认您的RE正在执行您认为他们正在做的事情。
2)在您的评论中,您说您不希望打印 ip 中的每个元素。 任意()函数将返回 True ,如果中任何的可迭代元素为真,则{ {3}}
if any(match.search(s) for s in ip):
# this if statement will be true if ANY of the elements of ip match the
# regex, and all of the statements under it will be executed
print(ip) # now you're printing the whole list, so even the ones that
# didn't match will be printed
3)如果你想让tryme()函数只返回 ip 列表的匹配元素,试试这个:
def tryme(ip):
match = re.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$")
return [element for element in ip if match.search(element)]
不要忘记修改代码的主体以捕获返回的列表并将其打印出来。
4)你有一个无用的任务:
with open('text.log') as f:
listofip=[]
count = 0
for l in f:
listofip = l.strip().split("\t")[5:8] # Grab the elements you want...
listofip 的第二个分配会覆盖您创建的空列表,因此您应该摆脱 listofip = [] 或在拼接时使用其他名称你的输入线。基于您原来的问题标题,我认为这样的事情可能更适合您:
import sys
import re
import operator
# using my definition of tryme() from section 3 of my answer
with open('text.log') as f:
list_of_ips = []
count = 0
retriever = operator.itemgetter(5, 7, 8)
for l in f:
list_of_ips.append(tryme(retriever(l.strip().split("\t"))))
count += len(list_of_ips) # add however many ips matched to current count
if count >= 20:
print("\n\n\n\n\n-----NEW GROUPING OF RESULTS-----\n\n\n\n\n\n")
count = 0 # reset count
list_of_ips = [] # empty the list of ips
这将迭代文件,获取与您的RE匹配的元素,将它们附加到列表中,并在列表中超过20时将其打印出来。请注意,它可能会打印大于20的组。我还添加了function name来简化切片和弹出。