如何使用Python正则从域名IP映射行中提取FQDN排除IP与+、=等特殊字符
正则提取域名与IP的实现方案
这个需求完全可以通过正则实现,我们只需要匹配每行的结构,拆分出域名(FQDN)和IP两个分组即可。
匹配逻辑说明
你的原始数据每行结构统一为:[可选+号][域名]=[IP地址],因此正则规则可以按如下逻辑编写:
- 匹配行首可选的
+号 - 提取
+之后、=之前的所有合法域名字符作为FQDN,域名允许的字符包括英文字母、数字、横杠-、点. - 提取
=之后的IPv4地址作为IP数据
正则规则与Python实现代码
我们使用分组匹配的方式一次提取两个目标字段,代码如下:
import re # 正则规则:分组1为FQDN,分组2为IP地址 # 规则说明: # ^ 匹配行首 # \+? 匹配可选的前置+号 # ([a-zA-Z0-9\-\.]+) 匹配合法域名字符,存入第一个分组 # = 匹配分隔符等号 # (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) 匹配IPv4地址,存入第二个分组 # $ 匹配行尾 record_pattern = re.compile(r'^\+?([a-zA-Z0-9\-\.]+)=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$') fqdn_list = [] ip_list = [] # 读取源文件,此处假设你的数据存在dns_list.txt中,可替换为你的文件路径 with open('dns_list.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue match_result = record_pattern.match(line) if match_result: fqdn_list.append(match_result.group(1)) ip_list.append(match_result.group(2)) # 如果你需要和你给出的预期结果一致的排序,可按域名长度倒序排列 sorted_fqdn = sorted(fqdn_list, key=lambda x: len(x), reverse=True) # 输出结果 print("提取到的FQDN列表:") for fqdn in sorted_fqdn: print(fqdn)
输出结果验证
运行代码后输出的FQDN列表完全符合预期,结果如下:
ben.example.com.np ben43.example.com ben-example.com ben.example.com example.com ben.example ben
注:你的原始数据中包含的ben-example.com也会被正常提取,如果你不需要该域名可自行添加过滤逻辑。
如果你需要严格校验IP地址的合法性(比如每个数字段不超过255),可以将IP部分的正则替换为更严格的规则即可。
内容的提问来源于stack exchange,提问作者ben shalev
相关产品推荐
相关产品推荐

