2016-08-10 40 views
0

我有這個自定義日誌事件,其中Severity: HIGH在每個事件中重複兩次。我試圖使用正則表達式匹配只有第一次出現,並刪除/替換它。在刪除/替換第一個匹配之前,我嘗試選擇第一個匹配,但是我的正則表達式匹配兩個匹配項。如何僅使用正則表達式匹配第一次出現

Host: Hostname 
VServer: NO 
Version: Oracle v11 
Cause: SQL exception 
Severity: HIGH 
JDKPath: C:\Program Files\Java\jdk1.7.0\bin 
Process: 2816 
Severity: HIGH 

這是我的正則表達式相匹配的都出現(Severity:)(.*)(Severity:\s.*)。如何僅匹配第一次出現(即第五行)而不是第二次出現(即最後一行)?

+0

您需要縮小問題範圍,不要使用任何可能的語言進行標記。 -1 –

+0

您的'(嚴重性:)(。*)'模式已經起作用,您接受了具有相同解決方案的答案。使用修飾符完全取決於正則表達式的風格,沒有任何表示。 –

回答

1

從你的問題,它不是在你使用正則表達式,其脈絡清晰(您標記PHP和Python),但在PHP ,這是相當簡單:

/(Severity:.*)/ 

demo

這工作,因爲默認情況下,.*令牌不符合新的一行字符。由於您的Severity列表包含多行,因此只有第一行匹配。

+0

感謝您的回答,我使用的是http://regexr.com/,它匹配了這兩個事件。 – Prime

+1

@Prime只有當你離開全局標誌時,你纔會看到兩個匹配,就像'/.../ g',我沒有在我的答案中。在RegExr上,您需要刪除該標誌(右上角的標誌選項)以測試我的解決方案。 – BeetleJuice

+0

@感謝刪除全局標誌/ g工作 – Prime

1

在Python,re.search

掃描通過尋找其中正則表達式圖案產生一個匹配,並返回對應的MatchObject實例的第一個位置。如果字符串中沒有位置與模式匹配,則返回None;請注意,這與在字符串中的某處找到零長度匹配不同。

>>> import re 
>>> 
>>> log = """Host: Hostname 
... VServer: NO 
... Version: Oracle v11 
... Cause: SQL exception 
... Severity: HIGH 
... JDKPath: C:\Program Files\Java\jdk1.7.0\bin 
... Process: 2816 
... Severity: HIGH""" 
>>> 
>>> m = re.search('Severity\: (.*)', log) 
>>> m.groups() 
('HIGH',) 

正如你所看到的,只有第一個匹配。

相反,如果你使用re.findallre.finditer,那麼你會得到兩個:

>>> b = re.findall('Severity\: (.*)', log) 
>>> b 
['HIGH', 'HIGH'] 
>>> 
>>> for f in re.finditer('Severity\: (.*)', log): 
... print f.groups() 
... 
('HIGH',) 
('HIGH',) 
>>> 
+0

感謝您的努力 – Prime

相關問題