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

DNS正则表达式搜索问题求助:从负载均衡配置提取域名失败

解决正则提取DNS域名的语法错误问题

嘿,刚上手Python正则确实容易踩语法小坑,我来帮你搞定这个从负载均衡配置里提域名的需求!

首先,先说说你可能遇到的「invalid syntax」错误原因:大概率是写正则时没加r前缀(原始字符串标记),导致Python把正则里的\b这类元字符当成了转义字符(比如退格符),或者是正则里有未闭合的括号、引号不匹配这类低级语法问题。

先看你的配置文件特点

从给出的示例行来看,域名要么是vserver名称的一部分(比如LB_TEST_EXT_treehouse.uncle.com里的treehouse.uncle.com),要么是独立的符合DNS规则的字符串。我们可以分两种场景来写正则:


场景1:提取所有符合DNS规则的域名

不管域名出现在配置的哪个位置,只要是标准DNS域名都提取。正则可以这么写:

import re

# 你的配置内容
config = """add lb vserver LB_TEST_EXT_treehouse.uncle.com SSL 10.212.17.100 443
add lb vserver LB_TEST_INT_treehouse.uncle.com SSL 10.212.17.99 443
add lb vserver REDIRECT_INT_tnucwcf.monkey.com HTTP 10.212.17.147 80
add lb vserver REDIRECT_EXT_tnucwcf.monkey.com HTTP 10.212.17.148 80
bind lb vserver LB_tnucleuswcf.oncologysupply.com 130-wbsvc-t-004
bind lb vserver SSL_INT_unucwcfSL.monkey.com 130-wbsv..."""

# 核心正则:匹配标准DNS域名
domain_pattern = r'\b(?:[a-zA-Z0-9][a-zA-Z0-9-]*\.)+[a-zA-Z]{2,}\b'
all_domains = re.findall(domain_pattern, config)

# 去重避免重复域名
unique_domains = list(set(all_domains))

print("提取到的所有域名:")
for dom in unique_domains:
    print(dom)

这个正则的逻辑:

  • \b:单词边界,避免误匹配IP地址(比如10.212.17.100这种数字结尾的不会被选中)
  • (?:[a-zA-Z0-9][a-zA-Z0-9-]*\.)+:匹配域名的子标签(比如treehouse.、uncle.),要求每个标签以字母/数字开头,可包含连字符,最后带点
  • [a-zA-Z]{2,}:匹配顶级域名(比如com、org),至少2个字母

场景2:仅提取vserver名称中最后一个下划线后的域名

如果你只需要vserver名称里的域名部分(比如从LB_TEST_EXT_treehouse.uncle.com里只拿treehouse.uncle.com),可以用这个更精准的正则:

vserver_domain_pattern = r'_([a-zA-Z0-9][a-zA-Z0-9-]*(?:\.[a-zA-Z0-9][a-zA-Z0-9-]*)*\.[a-zA-Z]{2,})\b'
vserver_domains = re.findall(vserver_domain_pattern, config)

print("\n从vserver名称提取的域名:")
for dom in vserver_domains:
    print(dom)

这个正则通过_定位前缀和域名的分隔点,只捕获下划线后的域名部分,避免提取到其他无关的点分隔字符串。


关键注意点

一定要给正则字符串加r前缀!比如r'\b...\b',这样Python不会解析正则里的反斜杠,避免语法错误和匹配异常。

内容的提问来源于stack exchange,提问作者Yepram Yeransian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:21:56