Python 从一行中提取特定的数字字符串

Python 从一行中提取特定的数字字符串,python,regex,python-3.x,Python,Regex,Python 3.x,我正在访问一个日志文件,其中包含以下行: May 1 07:39:30 example-server sshd[61362]: reverse mapping checking getaddrinfo for 37-115-223-100.broadband.kyivstar.net [37.115.223.100] failed - POSSIBLE BREAK-IN ATTEMPT! May 1 07:42:02 example-server sshd[61698]: reverse

我正在访问一个日志文件,其中包含以下行:

May  1 07:39:30 example-server sshd[61362]: reverse mapping checking getaddrinfo for 37-115-223-100.broadband.kyivstar.net [37.115.223.100] failed - POSSIBLE BREAK-IN ATTEMPT!

May  1 07:42:02 example-server sshd[61698]: reverse mapping checking getaddrinfo for 234.10.13.218.broad.fs.gd.dynamic.163data.com.cn [218.13.10.234] failed - POSSIBLE BREAK-IN ATTEMPT!
我想解析文件并提取方括号内的IP地址,该方括号位于短语(“反向映射检查…”之后和单词“失败”之前)

我不熟悉正则表达式,不知道该步骤

此外,Ip地址每八位组为100是令人困惑的,因为我不能使用[0-9[0-9](固定的东西)


请帮助我使用任何方法提取该IP地址。

此正则表达式应该可以:

r'reverse mapping checking getaddrinfo for \S+ \[([^\]]+)\]'
\S
表示没有空格字符,我使用
+
量词来获得IP的整个url,然后在方括号内捕获组,我使用以下组:


([\]]+)
。它只能捕获尽可能多的非
]
字符,因此它将捕获整个IP地址

我会按照以下方式做:

import re
text = '''May  1 07:39:30 example-server sshd[61362]: reverse mapping checking getaddrinfo for 37-115-223-100.broadband.kyivstar.net [37.115.223.100] failed - POSSIBLE BREAK-IN ATTEMPT!

May  1 07:42:02 example-server sshd[61698]: reverse mapping checking getaddrinfo for 234.10.13.218.broad.fs.gd.dynamic.163data.com.cn [218.13.10.234] failed - POSSIBLE BREAK-IN ATTEMPT!'''
ips = re.findall(r'(?<=\[)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=\])',text)
print(ips) # ['37.115.223.100', '218.13.10.234']
重新导入
text=''5月1日07:39:30示例服务器sshd[61362]:反向映射检查getaddrinfo for 37-115-223-100.broadband.kyivstar.net[37.115.223.100]失败-可能尝试中断!
5月1日07:42:02示例服务器sshd[61698]:对234.10.13.218.broad.fs.gd.dynamic.163data.com.cn[218.13.10.234]的getaddrinfo进行反向映射检查失败-可能尝试中断!'

ips=re.findall(r’(?我个人反对正则表达式在这种简单的情况下,python有出色的方法string.split(),可以更快更简单地工作。 为什么不呢

def get_ip(logstr):
  return logstr.split('reverse mapping checking', 1)[1].split('[', 1)[1].split(']', 1)[0]

with open(logfile) as f:
  for line in f:
    if 'reverse mapping checking' in line:
      print(get_ip(line))
它很简单-
logstr.split('reverse-mapping checking',1)
给你两个字符串-在索引为0的“reverse-mapping checking”之前和之后-在索引为1的情况下。我将spliting count设置为1,以建议python不要再搜索字符串。然后我们将字符串的秒数除以[1],然后再除以“[”,在[1]之后得到结果,然后被“]”分割,这次得到[0],因为ip是以前的。)这就是所有的

问题,这些问题都是关于堆栈溢出的主题之外的。可能重复使用,以优化正则表达式并向其中添加[]个文本。这很有效。非常感谢。(投票通过,但您不会在此处看到coz声誉问题)。
def get_ip(logstr):
  return logstr.split('reverse mapping checking', 1)[1].split('[', 1)[1].split(']', 1)[0]

with open(logfile) as f:
  for line in f:
    if 'reverse mapping checking' in line:
      print(get_ip(line))