附加搜索功能列表

时间:2014-07-15 21:50:38

标签: python

这是我当前的代码,但我不完全确定如何使用搜索结果附加列表。如果有人能提供任何帮助,我们将不胜感激。

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()

1 个答案:

答案 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来简化切片和弹出。