2014-05-15 74 views
0

有沒有辦法引用同名的2個不同的正則表達式變量?抓取0或1匹配的正則表達式變量

例如:

log1: 12-3-04: type=type1 event=GET user=thomas access_level=4 ip=1.1.1.1 port=443 dstip=2.2.2.2 dstport=432 

log2: 12-3-04: type=type1 event=GET user=brad userdb=Admin ip=1.1.1.1 access_level=2 

這兩個事件是相同的type但是它們的格式是一個有點不同

正則表達式:

的事件常見的正則表達式

\d+\-\d+\-\d+\:\s+type=(?P<type>\S+)\s+event\=(?P<event>\S+)\s+user\=(?P<user>\S+)\s+ 

LOG1正則表達式:

access_level\=(?P<access_level>\d+)\s+ip\=(?P<\S+>)\s+port\=(?P<\d+>)\s+dstip\=(?P<dstip>\S+)\s+dstport\=(?P<\d+>) 

的log 2的正則表達式:

userdb\=(?P<userdb>\S+)\s+ip\=(?P<ip>\S+)\s+access_level\=(?P<access_level>\d+) 

因爲這些事件類型是相同的,我希望有一個正則表達式1捕捉到這兩個事件。 我腦子裏想的是什麼

(common regex) + (log1 regex)? + (log2 regex)? 

這同時捕捉事件,但是這是常見的,必須有不同的名稱變量名。例如access_level。我希望能夠參考access_level並讓邏輯自動知道我想要哪個access_level

\d+\-\d+\-\d+\:\s+type=(?P<type>\S+)\s+event\=(?P<event>\S+)\s+user\=(?P<user>\S+)\s+(access_level\=(?P<access_level>\d+)\s+ip\=(?P<\S+>)\s+port\=(?P<\d+>)\s+dstip\=(?P<dstip>\S+)\s+dstport\=(?P<\d+>))?(userdb\=(?P<userdb>\S+)\s+ip\=(?P<ip>\S+)\s+access_level\=(?P<access_level>\d+))? 
+1

正則表達式真的需要這個嗎? 'line.split()[2:])中的dict(x.split('=')代表''給你更容易的工作方式。 – roippi

+0

@roippi我正在寫一個插件,所以我掃描日誌文件真正很長的正則表達式行哈哈糟透了,但我必須這樣做 – Liondancer

回答

1

什麼是這樣的:

(常見的正則表達式)+(ACCESS_LEVEL前日誌2的一部分)? +(access_level正則表達式)+(access_level之後的log 1的一部分)?

例如爲:

\d+\-\d+\-\d+\:\s+type=(?P<type>\S+)\s+event\=(?P<event>\S+)\s+user\=(?P<user>\S+)\s+(userdb\=(?P<userdb>\S+)\s+ip\=(?P<ip>\S+)\s+)?access_level\=(?P<access_level>\d+)(\s+ip\=(?P<ip2>\S+)\s+port\=(?P<port>\d+)\s+dstip\=(?P<dstip>\S+)\s+dstport\=(?P<dstport>\d+))? 

請務必小心測試:-)

我看,這樣做只爲ACCESS_LEVEL而不是知識產權工作。

+0

謝謝你的幫助,但對我的情況下,不會真的工作 – Liondancer

2

我不認爲這是可能的。一個小功能可以完成這項工作,並且更易於閱讀。

def parse_log_line(line): 
    name, date, *pairs = line.split(" ") 
    name = name.rstrip(":") 
    date = date.rstrip(":") 
    data = dict(pair.split("=", 2) for pair in pairs) 
    return (name, date, data) 

a = "log1: 12-3-04: type=type1 event=GET user=thomas access_level=4 ip=1.1.1.1 port=443 dstip=2.2.2.2 dstport=432" 
b = "log2: 12-3-04: type=type1 event=GET user=brad userdb=Admin ip=1.1.1.1 access_level=2" 

print(parse_log_line(a)[2]["access_level"]) 
print(parse_log_line(b)[2]["access_level"])