为什么我的Python正则表达式在空格之间不匹配?

时间:2015-11-18 14:34:17

标签: python regex

我想从Linux auth.log中提取登录信息并报告,但是正则表达式无法提取相关信息。我认为以空格(.*)为边界的组将匹配这些空格之间的完整文本段。它适用于第一个单词和用户名,但对于IP地址,它会从IP地址开始吐出整行文本。我错过了什么?

s='Accepted keyboard-interactive/pam for user101 from 10.19.36.76 port 36272 ssh2'
s2='Postponed keyboard-interactive for user101 from 10.19.36.76 port 36303 ssh2 [preauth]'

w = re.compile ("(.*) keyboard-interactive.*for (.*) from (.*) ");
m = w.search(s2)
if m:
   print "login by:", m.group(2)
   print "src ip  :", m.group(3)
   print "status  :", m.group(1)

输出:

login by: user101
src ip  : 10.19.36.76 port 36303 ssh2 [preauth]
status  : Postponed

OR:

login by: user101
src ip  : 10.19.36.76 port 36272 ssh2
status  : Accepted

2 个答案:

答案 0 :(得分:1)

因为(.*)会匹配from之后的所有内容(新行除外)。如果您只想匹配IP地址,可以使用如下字符类:

[\d.]+

或者更安全的方法使用以下内容:

((?:\d{1,3}\.){3}\d{1,3})

答案 1 :(得分:1)

w = re.compile ("(.*?) keyboard-interactive.*for (.*?) from (.*?) ");

                    ^^                              ^^         ^^    

让你的正则表达式非贪婪