我有一个包含以下条目的文本文件:
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
。
答案 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+字符。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(.*)