匹配第一个字符串匹配的另一行上面几行的字符串

时间:2017-11-16 02:56:13

标签: python python-3.x

所以,我有这个巨大的文本文件。我需要查找一个字符串,当我匹配它时,我需要返回几行(在当前行上方)并搜索另一个字符串并从该行包含第二个字符串中提取一些信息。如何使用正则表达式匹配在Python中执行此操作? 我想做这样的事情。

substr1 = re.compile("ACT",re.IGNORECASE)
substr2 = re.compile(vector,re.IGNORECASE) 

try:
    with open (filepath, 'rt') as in_file:  
        for linenum, line in enumerate(in_file):   
            if substr2.search(line) != None:
                print(linenum,line)

                    # Code to trace back a few lines to look for substr1

                break
except FileNotFoundError:                   # If the file not found,
    print("pattern not found.")                # print an error message.

当我匹配第一个字符串并查找第一个出现的第二个字符串时,有点像我想向后读它。线条数量各不相同,因此我不能使用我认为的出队选项。我是Python的新手。 任何帮助表示赞赏,谢谢! 我正在添加一个我正在阅读的示例日志文件。

X 123  
X 1234  
X 12345  
Vector1  
----  
-----  
-----  
X 1231  
X 12344  
X 123456  
vector a  
vector b  
vector c  
vector d  
-------  
-------  
Vector  
----  
-----  
-----  
X 1233  
X 12345  
X 123451  
Vector2

字符串1:Vector 字符串2:X

输出应为X 123456

1 个答案:

答案 0 :(得分:0)

您不需要回溯。相反,只需要以更聪明的方式向前搜索。如果您首先搜索substr1,则唯一可能发生的问题是在找到substr1之前会发现更多substr2。处理这种情况的方法是在你去的时候继续更新substr1的匹配。

根据您的描述,您似乎根本不需要正则表达式。相反,您似乎正在寻找简单的字符串包含测试。

substr1 = 'X'
substr2 = 'Vector'

with open (filepath, 'rt') as in_file:
    matched = None
    for linenum, line in enumerate(in_file, start=1):
        if substr1 in line:
            matched = line
        elif matched and line == substr2:
            # Process the second string
            print(matched)
            break

如果您在行的末尾有空格,就像您提供的示例中所做的那样,您可能希望使用line.startswith(substr2)代替line == substr2

次要修正:

  • start=1会使您的行号以1开头,这可能是您想要的。
  • 如果您想与None进行比较,正确的方式是is not None,而不是!=。此外,regex.search返回匹配对象。如果匹配发生,它将始终是真实的。检查它的惯用方法甚至没有is not None