Python正则表达式不能正常工作

Python正则表达式不能正常工作,python,regex,python-2.7,Python,Regex,Python 2.7,我是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 ope

我是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']
正如你所看到的,有一些东西应该被抓住,但却没有,我不知道为什么


提前感谢。

正则表达式总是很难读懂。试试在线正则表达式测试仪。这可能会为您提供有关错误的更多信息,您可以尝试不同的输入和表达式。以下是我的最爱:

在您的例子中,我认为您已经在正则表达式中添加了一些不应该存在的额外空格字符。空格也算作需要匹配的字符

我还会在用|分隔的表达式周围添加括号。有时插入|字符时很难知道使用了哪些部分

像这样:

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

我认为您不希望对正则表达式的某些部分使用更改“|”,相反,应该为要从字符串中提取的所有部分定义子字符串()。 你到底想提取什么?除此之外,请避免使用空空格并将空格定义为“\s”,我不确定[]是否是正确的替代项

这里有一个简单的例子,说明您可以(我不知道您真正需要什么)得到什么(尽管没有优化):


您的问题来自这样一个事实:您的
|
周围都有额外的空间。使用这种语法,
sshd[12130]
中的
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}密码无效


注意:我还删除了单个字符周围的额外括号。括号用于指定多个字符(如
[\d3]
表示任何3的字母,或
[a-z]
表示a和z之间的任何字符),或者如果要排除某个字符(如
[^]
表示除空格以外的任何字符)

如果将正则表达式放在这里,它会捕获您期望的结果吗?这似乎很有效,我犯了这样一个错误。非常感谢。
([\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})