正则表达式需求:依据远程主机名提取指定配置区块内容
解决方案
要实现根据指定远程主机名提取对应SOURCE区块的[1]至[5]内容,你需要构建一个通用且边界清晰的正则表达式,避免硬编码特定主机名或依赖固定字符串,同时确保不会跨区块匹配。
核心思路
- 精准匹配单个SOURCE区块的开头标记
- 定位到区块内的[1]节点
- 捕获包含目标主机名的内容,直到[5]节点结束
- 通过前瞻断言限制匹配边界,防止误匹配其他SOURCE区块
通用正则实现
以下是可复用的Python代码,支持传入任意目标主机名提取对应区块:
import re def get_source_block(config_str, target_host): # 构建正则模式,转义目标主机名避免特殊字符干扰 regex_pattern = re.compile( r'\*\*\*\* SOURCE#\d+ \*\*\*\*\s*\[1\]\s*(.*?Remote Host Name:\s*{}\s*.*?\[5\].*?)(?=\*\*\*\* SOURCE#|\Z)'.format(re.escape(target_host)), flags=re.DOTALL ) match_result = regex_pattern.search(config_str) # 返回匹配结果(去除首尾空白)或None return match_result.group(1).strip() if match_result else None
正则各部分说明
\*\*\*\* SOURCE#\d+ \*\*\*\*:匹配任意SOURCE区块的开头标记(兼容SOURCE#1、SOURCE#2等)\s*\[1\]\s*:匹配[1]节点,允许前后存在空白字符(换行、空格等).*?Remote Host Name:\s*{}\s*:匹配包含目标主机名的行,re.escape(target_host)确保主机名含特殊字符时不会出错.*?\[5\].*?:捕获从[1]到[5]的所有内容,非贪婪匹配避免过度延伸(?=\*\*\*\* SOURCE#|\Z):前瞻断言,确保匹配终止于下一个SOURCE区块开头或字符串末尾,防止跨区块匹配
使用示例
假设你的配置字符串如下:
**** SOURCE#1 **** [1] Remote Host Name: PNQ Port: 22 [2] Path: /data/pnq [3] Timeout: 30 [4] Retry: 2 [5] Enabled: Yes **** SOURCE#2 **** [1] Remote Host Name: PNR Port: 22 [2] Path: /data/pnr [3] Timeout: 30 [4] Retry: 2 [5] Enabled: Yes
调用函数提取PNR区块:
config = """上述配置字符串""" pnr_block = get_source_block(config, "PNR") print(pnr_block)
输出结果:
Remote Host Name: PNR Port: 22 [2] Path: /data/pnr [3] Timeout: 30 [4] Retry: 2 [5] Enabled: Yes
为什么之前的正则失效?
你之前的正则硬编码了PNQ和HDPGWRF,无法适配其他主机名;同时没有设置有效的匹配边界,可能会误匹配到其他区块的内容,或者无法完整捕获[1]至[5]的所有配置项。
内容的提问来源于stack exchange,提问作者musca999
相关产品推荐
相关产品推荐

