你如何在python中的字符串中找到文本,然后在它之后查找一个数字?

时间:2013-01-16 16:49:26

标签: python string search

我有一个日志文件,在文件的每一行末尾都有这个字符串: Line:#其中#是行号。

我正在尝试获取#并将其与上一行的数字进行比较。在python中最好的方法是什么?

2 个答案:

答案 0 :(得分:4)

我可能会使用str.split,因为它似乎很简单:

with open('logfile.log') as fin:
    numbers = [ int(line.split(':')[-1]) for line in fin ]

现在您可以使用zip将一个数字与下一个数字进行比较:

for num1,num2 in zip(numbers,numbers[1:]):
    compare(num1,num2)  #do comparison here.

当然,这不是懒惰的(当你真的一次只需要2个时,你会立即在文件中存储每个行号),所以如果你的文件是 HUGE,它可能占用大量的内存。不过要让它变得懒惰并不难:

def elem_with_next(iterable):
    ii = iter(iterable)
    prev = next(ii)
    for here in ii:
        yield prev,here
        prev = here

with open('logfile.log') as fin:
    numbers = ( int(line.split(':')[-1]) for line in fin )
    for num1,num2 in elem_with_next(numbers):
        compare(num1,num2)

答案 1 :(得分:3)

我假设你没有方便拆分字符串的东西,这意味着正则表达式可能更有意义。也就是说,如果日志文件中的行结构如下:

date: 1-15-2013, error: mildly_annoying, line: 121
date: 1-16-2013, error: err_something_bad, line: 123

然后你将无法像建议的那样使用line.split('#')作为mgilson,尽管如果总是有冒号,line.split(':')可能会起作用。无论如何,正则表达式解决方案看起来像:

import re
numbers = []
for line in log:
    digit_match = re.search("(\d+)$", line)
    if digit_match is not None:
        numbers.append(int(digit_match.group(1)))

这里表达式"(\d+)$"匹配一些数字,然后是行的末尾。我们在返回的匹配对象上使用group(1)方法提取数字,然后将它们添加到我们的行号列表中。

如果您不确定“Line:#”将始终位于日志的末尾,则可以使用类似"Line:\s*(\d+)"的内容替换上面使用的正则表达式,以检查字符串“Line” :“然后是一些(或没有)空格,然后是任意数量的数字。