我对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 :(得分: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)'
答案 1 :(得分:0)
我认为你不想使用改动" |"对于正则表达式的部分内容,您应该为要从字符串中提取的所有部分定义子字符串()。 你想要提取什么?除此之外,避免空格并将空格定义为" \ 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})
答案 2 :(得分:0)
您的问题来自于|
周围有额外空格。使用这种语法,12130
中的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
注意:我还会删除单个字符周围的额外括号。括号用于指定多个字符(如{3}的任何字母为[\d3]
或a和z之间的任何字符为[a-z]
或者如果要排除某个字符(如[^ ]
为任何字符)字符除了空格)