簡體   English   中英

如何將多個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

這將匹配以下任何行:

  • 以5開頭
  • 包含開始或結束

因此,您的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.

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