python:在search2之后标识以search1开头的第一行,而不遍历整个文件

python:在search2之后标识以search1开头的第一行,而不遍历整个文件,python,Python,问题: 识别每个服务器1之后的第一个时间戳 问题2: 预期产出: Time 02:02:02 Time 03:03:03 已尝试:re.findall(服务器1,问题2.*时间:\d+:\d+:\d+,文本,re.DOTALL)但它会打印04:04:04。无法使用re.MULTILINE,因为搜索和时间之间的行数可能不同。尝试使用时间分隔符分割选项,但由于分割返回的单词列表无法使用re.search或re.findall进行搜索(也无法使用索引)。在不需要遍历整个文件的情况下有什么建议吗 Se

问题:
识别每个服务器1之后的第一个时间戳

问题2:
预期产出:

Time 02:02:02
Time 03:03:03
已尝试:
re.findall(服务器1,问题2.*时间:\d+:\d+:\d+,文本,re.DOTALL)
但它会打印
04:04:04
。无法使用
re.MULTILINE
,因为搜索和时间之间的行数可能不同。尝试使用时间分隔符分割选项,但由于分割返回的单词列表无法使用re.search或
re.findall进行搜索(也无法使用索引)。在不需要遍历整个文件的情况下有什么建议吗

Server 1, Problem 1
Time : 01:01:01
Server 1, Problem 2
Server 2, Problem 2
Time: 02:02:02
Server 1, Problem 2
Server 2, Problem 2
Server 3, Problem 3
Time: 03:03:03
Server 4, Problem 4
Time : 04:04:04

您必须迭代整个文件才能找到您要查找的信息。不管怎样,Regex都会这样做,因此使用它不会跳过迭代。以下是解决此问题的方法:

times = []
capture_next_time = False
with open('test.txt','r') as f:
    for line in f:
        line = line.strip() 
        if line == 'Server 1, Problem 2':
            capture_next_time = True
        elif line.startswith("Time:") and capture_next_time:
            times.append(line)
            capture_next_time = False
print(times)
# >> ['Time: 02:02:02', 'Time: 03:03:03']
如果您担心文件太大,那么此方法使用一个
迭代器
,而不是将整个文件加载到内存中,这样在循环的每个周期中只处理一行

编辑:

如果您希望使用单线解决方案(尽管性能会更差),请参阅以下示例:


本质上,这个正则表达式会找到您的问题字符串,进行匹配,直到找到时间线唯一的字符(T也可以),然后捕获该行

服务器1,问题1您必须遍历整个文件。除非检查所有行,否则无法知道特定行是否不存在。谢谢,我想确认没有其他方法。谢谢。如果我必须遍历整个文件,我有一个类似的逻辑——如果我回答了你的问题,请记住接受答案。这会阻止其他人尝试一个已经“回答”的问题。如果我没有给你你需要的,让我知道,我们可以朝着更好的解决方案努力!我也用regex版本的答案更新了我的问题,但出于可读性和性能考虑,我建议不要这样做。不过,它更简洁。我很好奇我将如何使用正则表达式,再次感谢你
r"Server 1, Problem 2[^\:]*(Time: \d{2}\:\d{2}\:\d{2})"gm