2015-02-24 100 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]任何字母),或者如果要排除一个字符(如[^ ]以外空间的任何字符)

相关问题