【问题标题】:Match a string which is few lines above another line where the first string was matched匹配一个字符串,该字符串比第一个字符串匹配的另一行高几行
【发布时间】:2017-11-16 02:56:12
【问题描述】:

所以,我有这个巨大的文本文件。我需要查找一个字符串,当我匹配它时,我需要返回几行(在当前行之上)并搜索另一个字符串并从包含第二个字符串的那一行中提取一些信息。如何使用正则表达式匹配在 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.

当我匹配第一个字符串并寻找第二个字符串的第一次出现时,这有点像我想向后阅读它。行数各不相同,因此我不能使用我认为的 dequeue 选项。我对 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

【问题讨论】:

  • “少数”的界限是什么?
  • 另外,vector 是什么?是什么阻止您搜索substr1,然后向下查找几行以查找substr2
  • 几行大约是 100 行(取决于向量所在的位置),向量是我要查找的第一个字符串。然后我应该找到上面的第二个字符串(而不是向下)此行包含矢量。
  • 你能给个向量样本吗?我仍然不明白你为什么不按其他顺序搜索。如果找不到第二个匹配项,请继续。
  • “少数”有 hard 上限吗?例如,我可以说它永远不会出现超过 200 行吗?

标签: python python-3.x


【解决方案1】:

您无需回溯。相反,只需以更智能的方式向前搜索。如果您首先搜索substr1,唯一可能发生的问题是在您找到substr2 之前会找到更多的substr1。处理这个问题的方法是随时更新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

【讨论】:

  • 感谢您的编辑。逻辑必须有效,我需要在包含 substr1 的行上执行正则表达式。不是 substr2。
  • @wonder。我已尽力更新。当前代码使用您提供的输入进行测试,以提供您提供的输出。请解决您的问题。越读越难理解。
  • 谢谢@madphysicist,它工作得很好。如果我不能很好地传达问题,我真的很抱歉。我的意思是顶部字符串为字符串 2,底部字符串为字符串 1。我会更新它。谢谢你,我很感激。我是这个论坛的新手,很高兴知道人们如何帮助他人!
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2023-03-08
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多