【问题标题】:Python regex not working like it shouldPython 正则表达式无法正常工作
【发布时间】:2015-02-24 15:29:57
【问题描述】:

我对 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']

如您所见,有一些应该被捕获的东西丢失了,我不知道为什么。

提前致谢。

【问题讨论】:

  • 如果你把你的正则表达式放在这里,它会满足你的期望吗? regex101.com

标签: python regex python-2.7


【解决方案1】:

正则表达式总是难以阅读。尝试在线正则表达式测试器。这可能会为您提供有关问题所在的更多信息,并且您可以尝试不同的输入和表达式。这些是我的最爱:

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

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

像这样:

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

【讨论】:

  • 这似乎工作得很好,这对我来说是一个菜鸟错误。谢谢!
【解决方案2】:

我认为您不想使用更改“|”相反,对于您的正则表达式的一部分,您应该为要从字符串中提取的所有部分定义子字符串 ()。 你想准确提取什么?除此之外,避免使用空格并将空格定义为“\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})

【讨论】:

    【解决方案3】:

    您的问题来自这样一个事实,即您的所有 | 周围都有额外的空格。使用这样的语法,来自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}|Failed password for invalid

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

    【讨论】: