如何在具有多行字符串的文件中搜索多个字符串

时间:2019-03-24 18:40:09

标签: python file search

尝试编写一个脚本,该脚本将在整个文件中搜索某些字符串。

用于2个以上的字符串。

1) 首先搜索是检查以下两行之一:

0/RP1/CPU0    RP(Active)

0/RP0/CPU0    RP(Active)

如果'0/RP1/CPU0 RP(Active)',则打印此消息“ execute command location 0/rp1/cpu0

如果'0/RP0/CPU0 RP(Active)',则打印此消息“ execute command location 0/rp0/cpu0

2) 第二个搜索是检查以下多行之一: a)

INFO_LINE------------------: TITLE_LINE(A-Z)
  State                              : ENABLED

b)

INFO_LINE------------------: TITLE_LINE(A-Z)
  State                              : DISABLE

TITLE_LINE(A-Z)”可能会略有不同,但是INFO_LINE将是静态的,并且在ENABLEDDISABLE中都是相同的。

如果b)为true,则打印“ restart process on location (FROM SEARCH1)

我尝试了if/else/elif语句,并一直在使用re.search进行正则表达式的研究。

#!/usr/bin/python
activerp = open('sample-output.txt')

def check_active_rp():
    for line in activerp:
        if line.find('0/RP1/CPU0    RP(Active)'):
           print("execute command location 0/rp1/cpu0")
        else: 
           if line.find('0/RP0/CPU0    RP(Active)'):
            print("execute command location 0/rp0/cpu0")

运行此脚本python只会使我返回cli提示符,而我无法进一步完成其他搜索。

CLI $ python test.py CLI $

2 个答案:

答案 0 :(得分:0)

我想这就是你想要的:

def check_active_rp():
   string = '0/RP1/CPU0    RP(Active)'
   for line in activerp:
      if string in line:
         print('execute command location 0/rp1/cpu0')

答案 1 :(得分:0)

我创建了一个文件,其中包含您正在搜索的字符串并进行了一些测试,并且您的示例应该提供了一些输出,尽管有误。我以为您对python脚本没有足够的了解,但是如果我错了,请纠正我。

要执行您的函数,您需要调用它。编写def只是定义它。您可以找到有关here的更多信息。

我看到您正在为此使用正则表达式,但是如果要搜索的字符串中没有任何变化,则可以使用 find 函数。

问题是line.find()返回一个整数而不是一个布尔值。因此,除非您的行以'0/RP1/CPU0 RP(Active)'开头(否则它将返回0索引),否则您将始终输入第一个if语句。如果我们检查documentation,我们会发现 find 函数在未找到字符串的情况下返回-1。因此,您可以使用以下命令更改if语句:line.find('0/RP1/CPU0 RP(Active)') != -1。对于多行字符串也可以这样做。唯一的事情是您需要将整个文件转储为字符串。因此,请牢记这一点是可以解决问题的解决方案。

def check_active_rp(activerp):
    whole_file = activerp.read()

    if whole_file.find('0/RP1/CPU0    RP(Active)') != -1:
        print("execute command location 0/rp1/cpu0")
    elif whole_file.find('0/RP0/CPU0    RP(Active)') != -1:
        print("execute command location 0/rp0/cpu0")

    if whole_file.find('INFO_LINE------------------: TITLE_LINE(A-Z)\n  State                              : ENABLED') != -1:
        print('state is ENABLED')
    elif whole_file.find('INFO_LINE------------------: TITLE_LINE(A-Z)\n  State                              : DISABLE') != -1:
        print('restart process on location (FROM SEARCH1)')


with open('sample-output.txt') as active_rp:
    check_active_rp(active_rp)

在您的示例中,您也永远不会关闭文件,因此我使用了with语句,该语句在处理IO时被认为是一种很好的做法。

更新:

我刚刚发现您想更改信息行中写的内容,在这种情况下,使用正则表达式是适当的。以下解决方案将起作用:

import re

def check_active_rp(activerp):
    iterator = iter(activerp)
    for line in iterator:
        if line.find('0/RP1/CPU0    RP(Active)') != -1:
            print("execute command location 0/rp1/cpu0")
        elif line.find('0/RP0/CPU0    RP(Active)') != -1:
            print("execute command location 0/rp0/cpu0")

        pattern = re.compile('INFO_LINE------------------: ([A-Z]+)')

        x = pattern.search(line)

        if x:
            line = next(iterator)
            if line.find('ENABLED') != -1:
                print('the {} is ENABLED'.format(x.group(1)))
            elif line.find('DISABLE') != -1:
                print('the {} is DISABLED'.format(x.group(1)))


因此,我们在文件外创建了一个迭代器,并开始逐行浏览文件。对于第一个字符串搜索,我们仍然使用字符串查找功能。现在我们继续到信息线。使用regex包,我们编译了一个捕获TITLE_LINE的正则表达式。找到后,我们从迭代器获取下一行,并再次检查字符串是否包含ENABLED或DISABLE;并进行相应打印。