2013-09-26 117 views
0

我的示例日誌文件很大,包含下面幾行。Python正則表達式不匹配行

<6>[16495.700255] 

Memory - START UC1 

<4>16495.723327 C0 Memory - START UC1 

<4>[16495.723327] C0 [    sh] Memory - START UC1 

我找Memory - START UC1 下面的正則表達式得到前兩行,但不是第三。

re.compile("(Memory - +(.*)$)") 
+2

請顯示您使用正則表達式的完整代碼。 –

+0

你想讓正則表達式匹配整條線,你是用更像'grep'的東西來使用它,還是隻對'Memory - START UC1'部分感興趣? – AJMansfield

+0

此外,還有什麼其他有效的可能性爲'記憶 - 啓動UC1'部分?它會永遠只是那樣嗎,或者我可以像'Memory - STOP FK9'或'Memory - FOO BAR BAZ' ... – AJMansfield

回答

1

更改編譯到:

re.compile("(.*?Memory - START UC1)") 

看看是否有幫助

這似乎對ideone

工作,如果你只是想獲得這個詞,請用正則表達式:

regex = compile(r'([^.* ]?Memory - START UC1)') 
+0

謝謝。有效。 – user2344495

2

使用re.MULTILINE作爲re.compile的標誌或將(?m)添加到正則表達式的開頭。 $只匹配字符串的末尾,除非MULTILINE模式打開,當它匹配任何行的末尾時。

2

我將您的問題 - re.compile("(Memory - +(.*)$)")中的原始正則表達式複製到您的後續答案的代碼中,並將其與您問題中的示例文本進行比對,並獲得了所有三個匹配項。

@的re.compile("(.*?Memory - START UC1)") Smac89的建議是隻需要如果要調用與event_regex.match(line)正則表達式,這是隱含固定字符串(^)的開始;如果你使用search(line)findall(line)那麼.*?不會做任何事情,除非使正則表達式更難以閱讀:它非貪婪地匹配零個或多個任何東西,所以如果你沒有錨定到字符串的開始,那麼它將結束無論如何,匹配零個字符。
而且我認爲[^.* ]?的建議更加不合理,除非我非常錯誤(發生得太頻繁)。這就是說:匹配零個或一個字符組成的字符組,其中包括所有字符,除了字面值.,字面值*或空格。再說一次,如果你不是固定在字符串的開始部分,那麼正則表達式的這一部分無論如何都會最終匹配零字符。

老實說,如果你知道你想匹配確切的字符串Memory - START UC1,那麼你可能會更好用一個簡單的line.contains('Memory - START UC1'),而不是一個正則表達式。
但你最初的正則表達式包含+(這是'空間加') - 一個或多個空格 - 如果空格的數量可能會有所不同,那麼是的,你確實需要一個正則表達式。在這種情況下,您可能還會考慮\s+,它與空格和製表符(以及其他一些更稀有的空格字符)都匹配。如果可能存在尾隨空格,那麼您應該在字符串末尾的錨點之前放置\s*。 (其實我懷疑,尾隨空格是你最初的正則表達式不匹配目標字符串的三分之一發生的原因。)

一對夫婦的其他提示:
在您最初的正則表達式,"(Memory - +(.*)$)"你有兩個捕獲組(即),但我懷疑你實際上只需要一個,這取決於你只對「UC1」還是對「Memory - UC1」全部感興趣。
此外,您的if not line:子句從不會觸發,因爲空白行仍然有換行符。你可以做line.strip() - 既然你已經做了line.strip()後來,我只想把一個line = line.strip()在循環的頂部,然後只用line其後,而不是重複的函數調用。這是一個很好的想法,但在這種情況下,我不確定它是否真的能爲您節省任何東西,因爲它不需要很長的時間就可以確定空白行上沒有匹配。
最後的想法:它看起來像只在給定的行上最多隻有一個匹配。如果是這種情況,請使用search(...)而不是findall(...)。沒有必要繼續尋找你找到你想要的東西。

正則表達式涉及到一點學習曲線,但是一旦你把它們訓練出來,它們就會非常強大。堅持下去!