大型日志文件上的Python-Regex

大型日志文件上的Python-Regex,python,regex,parsing,Python,Regex,Parsing,我有一个大约3000行长的日志文件,我需要找到一些字符串的第一个匹配项。哪种方法是最好/最有效的方法 with open(filename, 'r') as f: match = re.search(r'^EXHAUST.*', f.read(), re.MULTILINE) 或 或者有没有更好的方法我没有想到?在这种情况下,您可以使用str.startswith作为一种更具python风格的方法: with open(filename, 'r') as f: for line

我有一个大约3000行长的日志文件,我需要找到一些字符串的第一个匹配项。哪种方法是最好/最有效的方法

with open(filename, 'r') as f:
    match = re.search(r'^EXHAUST.*', f.read(), re.MULTILINE)


或者有没有更好的方法我没有想到?

在这种情况下,您可以使用
str.startswith
作为一种更具python风格的方法:

with open(filename, 'r') as f:
    for line in f:
        if line.startswith('EXHAUST') :
           #do stuff

但是关于使用
re.search
vs
re.match
如果您想从一开始就匹配字符串,那么使用为这个目的而设计的
re.match
会更有效。

在这种情况下,作为一种更具python风格的方式,您可以使用
str.startswith

with open(filename, 'r') as f:
    for line in f:
        if line.startswith('EXHAUST') :
           #do stuff

但是关于使用
re.search
vs
re.match
如果您想从一开始就匹配字符串,那么使用为这个目的设计的
re.match
会更有效。

我喜欢您的第二个方法,但是性能方面,因为您的正则表达式非常简单,您可以使用startswith方法

with open(filename, 'r') as f:
    for line in f:
        match = line.startswith('EXHAUST')

我喜欢你的第二个,但从性能上看,因为你的正则表达式非常简单,你可以使用startswith方法

with open(filename, 'r') as f:
    for line in f:
        match = line.startswith('EXHAUST')

实际上,您可以通过Python的datetime库这样简单的工具来检查算法使用的近似时间,例如:

import datetime

start = datetime.datetime.now()
# insert your code here #
end = datetime.datetime.now()

result = end - start
print(result)
问题是,使用这两种方法,python算法查找短语所需的3000行时间都很低。然而,从我的测试来看,如果文本位于靠近文本末尾的位置,则第一种方法的速度要快一些。我测试了一个454kb的文本文件,有3000多行,其中大部分是整段。数字约为0.09s(如下所示)。但是,我必须指出,如果没有用于匹配字符串开头的^regex符号,则完成任务所需的时间仅为0.04秒

with open(filename, 'r') as f:
    match = re.search(phrase, f.read())
相对于0.12秒

with open(filename, 'r') as f:
    i = 0
    for line in f:
        i += 1
        match = re.match(phrase, line)
            if match:
            break;
这里需要break,否则match对象将是最后一个找到的匹配项,我用它来找出我们在哪一行找到了匹配项。因为position的.start和.end方法与我们所在的行相关。但是,在搜索方法上,默认情况下,您可以通过.start和.end匹配对象方法获得匹配位置

然而在我的测试用例中,第一次出现在.txt文件的末尾,所以如果它更接近开始,第二个方法将占上风,因为它将停止在该行的搜索,而第一个方法的时间消耗保持不变


除非您这样做是为了进行竞争性编码(Python可能不是最好的选择),否则这两种方法花费的时间都非常少。

您可以通过Python的datetime库这样简单的工具实际检查算法使用的大致时间,例如:

import datetime

start = datetime.datetime.now()
# insert your code here #
end = datetime.datetime.now()

result = end - start
print(result)
问题是,使用这两种方法,python算法查找短语所需的3000行时间都很低。然而,从我的测试来看,如果文本位于靠近文本末尾的位置,则第一种方法的速度要快一些。我测试了一个454kb的文本文件,有3000多行,其中大部分是整段。数字约为0.09s(如下所示)。但是,我必须指出,如果没有用于匹配字符串开头的^regex符号,则完成任务所需的时间仅为0.04秒

with open(filename, 'r') as f:
    match = re.search(phrase, f.read())
相对于0.12秒

with open(filename, 'r') as f:
    i = 0
    for line in f:
        i += 1
        match = re.match(phrase, line)
            if match:
            break;
这里需要break,否则match对象将是最后一个找到的匹配项,我用它来找出我们在哪一行找到了匹配项。因为position的.start和.end方法与我们所在的行相关。但是,在搜索方法上,默认情况下,您可以通过.start和.end匹配对象方法获得匹配位置

然而在我的测试用例中,第一次出现在.txt文件的末尾,所以如果它更接近开始,第二个方法将占上风,因为它将停止在该行的搜索,而第一个方法的时间消耗保持不变


除非您这样做是为了竞争性的编码(Python可能不是最好的选择),否则这两种方法都只需要很少的时间。

多大是“大”,如果您只需要第一次出现,那么在找到子字符串后逐个读取字符串并断开将很可能为您节省一些时间。行是否以字符串开头(如您的re所示),字符串是硬编码的还是模式?一般来说,如果它是一个固定的字符串,那么使用字符串方法是最好的选择,而不是
re
@Lutz Horn,它大约有3000行long@Ripread那是一个小文件“大”有多大,如果您只需要第一次出现,那么在找到子字符串后逐个读取字符串并断开将很可能为您节省一些时间。行是否以字符串开头(如您的re所示),字符串是硬编码的还是模式?一般来说,如果它是一个固定的字符串,那么使用字符串方法是最好的选择,而不是
re
@Lutz Horn,它大约有3000行long@Ripread那是一个小文件。