2015-02-24 51 views
2

我是相當新的python和我正在一個任務,我應該繼續建設一個正則表達式,我遇到了一個句號。Python的正則表達式不應該像它應該

由於某些原因,當添加後面的部分時,某些正則表達式會崩潰並停止匹配先前匹配的幾個字符串。

我應該跑,看起來像這樣的一個字符串的正則表達式:

Sep 15 04:34:02 li146-252 sshd[12130]: Failed password for invalid user ronda from 212.58.111.170 

代碼:

#!/usr/bin/python 
import re 

with open('livehack.txt', 'r') as file: 
    for line in file: 
     dateString = re.findall('^(?:[A-z][a-z]{2}[ ][0-9]{1,2}[ ][\d]{2}[:][\d]{2}[:][\d]{2}) | li146-252 | ?:[0-9]{5} | Failed password for invalid', line) 
     print dateString 

代碼的結果是:

['Sep 17 06:40:28 ', ' Failed password for invalid'] 

由於你可以看到,有幾件事應該被發現,但我不知道爲什麼。

在此先感謝。

+0

如果你把你的正則表達式這裏它捕捉你期望的? https://regex101.com/ – danielfranca 2015-02-24 15:35:50

回答

1

正則表達式總是難以閱讀。嘗試使用在線Regex測試器。這可能會給你更多關於錯誤的信息,你可以嘗試不同的輸入和表達式。這些都是我的最愛:

在你的情況我想你已經添加了一些額外的空格字符的正則表達式是不應該存在。空間也被視爲需要匹配的角色。

我還會在用|分隔的表達式周圍添加括號。有時很難知道插入|時使用哪些部分字符。

像這樣:

'(?:^(?:[A-z][a-z]{2}[ ][0-9]{1,2}[ ][\d]{2}[:][\d]{2}[:][\d]{2}))|(?:li146-252)|(?:[0-9]{5})|(?:Failed password for invalid)' 
+0

這似乎工作得很好,我這方面的這樣一個noob錯誤。謝謝! – user249494 2015-02-24 16:01:01

0

我想你不希望使用變更 「|」對於你的正則表達式的一部分,你應該爲你想要從字符串中提取的所有部分定義substrings()。 你想完全提取什麼?除此之外,避免空格並將空格定義爲「\ s」,我不確定[]是否是正確的替代。

還有就是你可以(我不知道你真正需要的)得到什麼(無優化雖然)一個簡單的例子:

([\D]{2,3}\s\d{2}\s\d{2}:\d{2}:\d{2})\s(li146-252)\s(sshd\[\d+\]):\s[\D\s]+((\d{1,3}\.){3}\d{1,3}) 
0

你的問題來自於一個事實,你必須有多餘的空格你所有的|。使用這樣的語法,與sshd[12130]不匹配,因爲它被括號包圍,而不是空格。並且li146-252未捕獲,因爲前導空間已用於捕獲Sep 17 06:40:28

所以空間剝離正則表達式應該做你想要什麼:

^(?:[A-z][a-z]{2} [0-9]{1,2} \d{2}:\d{2}:\d{2})|li146-252|[0-9]{5}|Failed password for invalid

注:我也刪除圍繞單個字符的額外的支架。支架是用來指定幾個字符(比如[\d3]爲a到z之間的任何字符的3或[a-z]任何字母),或者如果要排除一個字符(如[^ ]以外空間的任何字符)

相關問題