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
相关产品推荐
相关产品推荐

