Python re.findall有多种模式

时间:2018-03-22 13:42:51

标签: python regex python-3.x

我有一个包含以下条目的文本文件:

 Interface01 :
     adress
        192.168.0.1
next-interface:
 interface02:
     adress
        10.123.123.214
next-interface:
 interface01 :
     adress
        172.123.456.123

我想解析它并只获取与Interface01对应的IP地址

我尝试使用python re.finall,但无法获得任何匹配的内容

 i = open(f, r, encoding='UTF-8')
 txt = i.read()
 interface = re.findall(r'Interface01 :\s*(.adress*)n',txt,re.DOTALL)

但没有任何作用。

预期结果为192.168.0.1

6 个答案:

答案 0 :(得分:2)

如何创建一个表示“Interface01”的模式,然后跳过所有不是数字的字符,然后获取数字和点?

re.findall(r'Interface01[^0-9]+([0-9.]+)', text)

结果:

['192.168.0.1']

更新

感谢@zipa,这是更新的正则表达式:

re.findall(r'[iI]nterface01[^0-9]+([0-9.]+)', text)

结果:

['192.168.0.1', '172.123.456.123'

答案 1 :(得分:2)

您可以使用

Interface01\s*:\s*adress\s+(.*)

请参阅regex demo。在Python中,使用re.search获取第一个匹配项,因为您只想提取1个IP地址。

模式详情

  • Interface01 - 文字子字符串
  • \s*:\s* - 包含0 +空格的:
  • adress - 文字子字符串
  • \s+ - 1+空格
  • (.*) - 第1组:除了换行符之外的任何0+字符。

Python demo

import re
reg = r"Interface01\s*:\s*adress\s+(.*)"

with open('filename') as f:
    m = re.search(reg, f.read())
    if m:
        print(m.group(1))

# => 192.168.0.1

答案 2 :(得分:0)

interface = re.findall(r'Interface01 :\s*.adress\s*(.*?)$',txt,re.S|re.M)        

答案 3 :(得分:0)

您可以尝试这样的事情:

interface = re.findall(r'Interface01 :\n +adress\n +(\d+.\d+.\d+.\d+)', txt)
# ['192.168.0.1']

答案 4 :(得分:0)

为了获得一个匹配,最好使用re.serach()函数:

import re

with open('filename') as f:
    pat = r'Interface01 :\s*\S+\s*((?:[0-9]{1,3}\.){3}[0-9]{1,3})'
    result = re.search(pat, f.read()).group(1)

print(result)

输出:

192.168.0.1

答案 5 :(得分:0)

您可以使用Interface01 :\n.*?\n(.*)