You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式需求:依据远程主机名提取指定配置区块内容

解决方案

要实现根据指定远程主机名提取对应SOURCE区块的[1]至[5]内容,你需要构建一个通用且边界清晰的正则表达式,避免硬编码特定主机名或依赖固定字符串,同时确保不会跨区块匹配。

核心思路

  1. 精准匹配单个SOURCE区块的开头标记
  2. 定位到区块内的[1]节点
  3. 捕获包含目标主机名的内容,直到[5]节点结束
  4. 通过前瞻断言限制匹配边界,防止误匹配其他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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:16:34