簡體   English   中英

您如何在python中的字符串中查找文本,然后在其后查找數字?

[英]How would you find text in a string in python and then look for a number after it?

我有一個日志文件,文件的每一行的末尾都有以下字符串: Line:#其中#是行號。

我正在嘗試獲取#並將其與上一行的數字進行比較。 在python中做到這一點的最佳方法是什么?

我可能會使用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在同一時間),所以如果你的文件是巨大的 ,可能會占用大量的內存。 不過,讓它變得懶惰並不難:

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)

我假設您沒有方便的拆分字符串的方法,這意味着正則表達式可能更有意義。 也就是說,如果日志文件中的行結構如下:

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+)" ,以檢查是否字符串“行:”,然后是一些(或沒有)空格,然后是任意數量的數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM