【问题标题】:Extracting a specific string of numbers from a line从一行中提取特定的数字字符串
【发布时间】:2019-08-11 13:23:43
【问题描述】:

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

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 地址

我是正则表达式的新手,无法弄清楚步骤。

另外,每个八位字节 100 的 IP 地址令人困惑,因为我不能使用 [0-9[0-9](固定的东西)

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

【问题讨论】:

标签: python regex python-3.x


【解决方案1】:

这个正则表达式应该可以工作:

r'reverse mapping checking getaddrinfo for \S+ \[([^\]]+)\]'

\S 表示没有空格字符,我使用 + 量词来获取带有 IP 的整个 url,然后捕获方括号内的组,我正在使用这个组:

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

【讨论】:

  • 成功了。非常感谢。 (已投票,但您不会在这里看到声誉问题)。
【解决方案2】:

我会这样做:

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

请注意,我使用了所谓的r-string,所以我可以使用单个\ 作为转义而不需要转义它。我的模式由 3 个主要部分组成:

  • (?&lt;=\[)是零长度断言,意思是:检查匹配前是否有[[有特殊含义需要转义
  • \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 是由 1 到 3 位数字组成的四个数字 (\d),由点剪切而成(. - 再次需要转义,因为 . 具有特殊含义)
  • (?=\])是零长度断言,意思是:检查匹配后是否有]]也需要转义。

【讨论】:

    【解决方案3】:

    在这种简单的情况下,我个人反对正则表达式,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,之后——索引为 1。我将拆分计数设置为 1,以建议 python 不要再搜索字符串。然后我们用 [1] 取第二个字符串,再用 '[' 分割它,在 [ 之后用 [1] 得到东西,然后用 ']' 分割得到 [0],因为 ip 在 ] 之前。就是这样

    【讨论】:

      【解决方案4】:
      import re
      
      regex = r"\[[0-9.]+\] failed"
      
      test_str = ("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!\n\n"
          "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!")
      
      matches = re.finditer(regex, test_str, re.MULTILINE)
      mapping = [ (' failed', ''), ('[', ''), (']', '') ]
      
      
      for matchNum, match in enumerate(matches, start=1):
          my_string = match.group()
          for k, v in mapping:
              my_string = my_string.replace(k, v)    
          print ("IP : {match}".format(match = my_string))
      

      【讨论】:

        猜你喜欢
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 2021-12-10
        • 2020-07-24
        • 1970-01-01
        • 2014-11-16
        • 2022-08-10
        相关资源
        最近更新 更多