![](/img/trans.png)
[英]How would you check if a letter/number/symbol is in a string? (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.