如何用Python正则表达式提取TNS Ping输出中的主机信息?
从TNS Ping输出中提取主机名的正则表达式解决方案
问题
需要从TNS Ping的输出数据中提取所有主机信息,但原正则表达式无法正确匹配,也无法提取多个结果。
示例数据与原代码
DATA=""" TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 20-SEP-2023 12:13:43 Copyright (c) 1997, 2022, Oracle. All rights reserved. Used parameter files: /oracle/rdbms/19.2/network/admin/sqlnet.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (SDU=32767)(SEND_BUF_SIZE=16777216)(RECV_BUF_SIZE=16777216) (ADDRESS = (PROTOCOL = TCPS)(HOST = host1-1-ia2-vip.world.net)(PORT = 1523)) (ADDRESS = (PROTOCOL = TCPS)(HOST = host2-2-ia2-vip.world.net)(PORT = 1523)) (LOAD_BALANCE = YES) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = TESTDB92))) OK (50 msec) """ # 原正则表达式无法匹配目标内容 m = re.search('HOST\s\w+\s(\w+)', DATA) m.group(1)
期望输出
host1-1-ia2-vip.world.net host2-2-ia2-vip.world.net
解决方法
原正则表达式存在两个问题:
\w+仅匹配字母、数字和下划线,无法覆盖主机名中的连字符(-)和点号(.)re.search仅返回第一个匹配结果,无法提取所有主机名
修正后的代码
import re DATA=""" TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 20-SEP-2023 12:13:43 Copyright (c) 1997, 2022, Oracle. All rights reserved. Used parameter files: /oracle/rdbms/19.2/network/admin/sqlnet.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (SDU=32767)(SEND_BUF_SIZE=16777216)(RECV_BUF_SIZE=16777216) (ADDRESS = (PROTOCOL = TCPS)(HOST = host1-1-ia2-vip.world.net)(PORT = 1523)) (ADDRESS = (PROTOCOL = TCPS)(HOST = host2-2-ia2-vip.world.net)(PORT = 1523)) (LOAD_BALANCE = YES) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = TESTDB92))) OK (50 msec) """ # 匹配所有HOST字段后的主机名 hosts = re.findall(r'HOST\s*=\s*([\w.-]+)', DATA) # 打印结果 for host in hosts: print(host)
正则表达式说明
HOST\s*=\s*:匹配HOST =模式,\s*兼容前后任意数量的空白字符(避免因空格数量不同导致匹配失败)([\w.-]+):捕获主机名,[\w.-]允许匹配字母、数字、下划线、连字符和点号,覆盖标准主机名的合法字符
运行结果
host1-1-ia2-vip.world.net host2-2-ia2-vip.world.net
内容的提问来源于stack exchange,提问作者user9599919
相关产品推荐
相关产品推荐

