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