![](/img/trans.png)
[英]Reading environment variables from more than one ".env" file in Python
[英]How to pass more than one python variables into regex insearch of finding lines from a text file?
如何從以5開始的日志文件中查找行集,並且必須具有2個開始時間和結束時間的時間戳記值,其格式可以是(例如:14/05/02 02:30:00),可以通過以下方式輸入用戶使用RegularExpression嗎?
我需要一個腳本來搜索我的日志文件中搜索3個參數的每一行:
1)開始時間(由用戶輸入),例如: 14/05/02 02:30:00
2)結束時間(由用戶輸入),例如: 14/05/02 02:45:00
3)行以數字“ 5”開頭
我的日志文件的示例行:
9,14/05/02 02:30:00,1,1,94767539135,94767539135,0,1,172839,0,1,172839,,14/05/02 02:30:00,9477000003,,,,,93,14/05/02 03:30:00,0,0,9477000008,,false,,,,,,,,false,0,5011405020230005756,67000,
5,14/05/02 02:30:00,1,1,94776082043,94776082043,0,1,77100,0,1,77100,,14/05/02 02:30:00,9477000003,,,,,19,14/05/05 02:30:00,0,0,9477000007,9477000003,false,,,,,,,,true,,,0,,5011405020230005752,
11,14/05/02 02:30:00,94776082043,1,9477000051,,,5011405020230005752,
12,14/05/02 02:30:00,true,false,9477000008,413025705057121,,,,5011405020230005748,
3,14/05/02 02:30:00,1,1,94713784377,0,1,1,94771653521,0,1,0713784377,,14/05/02 02:29:48,9477000003,413021500734521,,,,0,14/05/05 02:29:50,,,9477000006,9477000006,,,,,,,,,,,,,0,5011405020229484460,
9,14/05/02 02:30:00,1,1,94771969046,94771969046,0,1,776236,0,1,776236,,14/05/02 02:30:00,9477000003,,,,,62,14/05/05 02:30:00,0,0,9477000008,,false,,,,,,,,false,0,5011405020230005763,67000,
5,14/05/02 02:30:00,1,1,94771059909,94771059909,1,1,94776716217,1,1,94776716217,,14/05/02 02:29:57,9477000003,413020776716217,,,,54,14/05/05 02:29:55,0,0,9477000006,9477000047,false,,,,,,,,false,,,0,,5011405020229575408,
這是我嘗試過的代碼的一部分:
#!/usr/bin/env python
import re
count=0
fh = open(r"/home/harzyne/pythonscripts/read_log_file.txt")
yyyy,mo,dd,hh,mm = raw_input("Enter Start_Time in format(yy,mm,dd,hh,mm)").split(',')
yyyy1,mo1,dd1,hh1,mm1 =raw_input("Enter End_Time in format(yy,mm,dd,hh,mm)").split(',')
for i in fh:
if re.search('^5',i):
count +=1
print count
try:
#start_t = datetime(2014,5,2,02,30)
#end_t = datetime(2014,5,2,02,45)
start_t = datetime(int(yyyy),int(mo),int(dd),int(hh),int(mm))
end_t = datetime(int(yyyy1),int(mo1),int(dd1),int(hh1),int(mm1))
diff = end_t - start_t
except ValueError:
print ("invalid arguement")
#start = raw_input("Enter Start_Time in format(yyyy,mm,dd,hh,mm) ")
#end = raw_input("Enter End_Time in format(yyyy,mm,dd,hh,mm)")
no_of_msg_per_sec = float(count)/diff.seconds
print no_of_msg_per_sec
這是如何構建搜索模式和計算行數的示例:
#!/usr/bin/python
import re
s = '''9,14/05/02 02:30:00,1,1,94767539135,94767539135,0,1,172839,0,1,172839...
5,14/05/02 02:30:00,1,1,94776082043,94776082043,0,1,77100,0,1,77100,,14/05/0...
11,14/05/02 02:30:00,94776082043,1,9477000051,,,5011405020230005752,
12,14/05/02 02:30:00,true,false,9477000008,413025705057121,,,,50114050202300...
3,14/05/02 02:30:00,1,1,94713784377,0,1,1,94771653521,0,1,0713784377,,14/05/...
9,14/05/02 02:30:00,1,1,94771969046,94771969046,0,1,776236,0,1,776236,,14/05...
5,14/05/02 02:29:59,1,1,94771059909,94771059909,1,1,94776716217,1,1,94776...'''
start_sb = r'14/05/02 02:29:59'
end_sb = r'14/05/02 02:30:00'
p = re.compile(r'^5,' + end_sb + r',.*\n([\s\S]*?)^5,' + start_sb + r',', re.M)
m = p.search(s)
if (m):
print m.group(1).count("\n")
else
print 'no result'
想法是將所有內容放在捕獲組的開始和結束限制之間,然后計算該組中的換行符的數量。
關於模式本身:
.*
將匹配所有字符,直到行尾
[\\s\\S]
是匹配所有字符(包括換行符)的著名技巧
([\\s\\S]*?)
是捕獲組1,它使用惰性量詞來捕獲所有數據,直到以5開頭的第一行和開始日期時間為止。
re.M
選項( MULTILINE
)將^
錨的含義從字符串的開頭更改為行的開頭 。
import re
text = '''9,14/05/02 02:30:00,1,1,94767539135,94767539135,0,1,172839,0,1,172839...
5,14/05/02 02:30:00,1,1,94776082043,94776082043,0,1,77100,0,1,77100,,14/05/0...
11,14/05/02 02:30:00,94776082043,1,9477000051,,,5011405020230005752,
12,14/05/02 02:30:00,true,false,9477000008,413025705057121,,,,50114050202300...
3,14/05/02 02:30:00,1,1,94713784377,0,1,1,94771653521,0,1,0713784377,,14/05/...
9,14/05/02 02:30:00,1,1,94771969046,94771969046,0,1,776236,0,1,776236,,14/05...
5,14/05/02 02:29:59,1,1,94771059909,94771059909,1,1,94776716217,1,1,94776...'''
start = r'14/05/02 02:29:59'
end = r'14/05/02 02:30:00'
regex = r'(^5.*(?:' + start + '|' + end + ').*$)'
matches = re.findall(regex, text, re.M)
print matches
這將匹配以下任何行:
因此,您的count
將是len(matches)
。
輸出:
['5,14/05/02 02:30:00,1,1,94776082043,94776082043,0,1,77100,0,1,77100,,14/05/0...',
'5,14/05/02 02:29:59,1,1,94771059909,94771059909,1,1,94776716217,1,1,94776...']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.