一、需求场景分析
在网络爬虫开发、日志分析或安全监测等场景中,我们经常需要从复杂文本中提取特定域名。本文将以以下域名集合为例,演示如何通过Python实现精准提取:
oyex.cc
oyix.cc
oyie.cc
oyii.cc
oyxe.cc
oyxx.cc
ouyy.cc
ouyz.cc
oyio.cc
oyia.cc
二、实现思路解析
2.1 域名结构特征
观察目标域名可以发现以下特征:
- 使用
.cc顶级域名 - 主体部分由4个字符组成
- 前两个字符固定为
oy或ou - 后两个字符为字母组合
2.2 技术方案选择
推荐使用正则表达式结合Python的re模块实现,其优势在于:
- 模式匹配高效准确
- 支持复杂规则组合
- 可扩展性强
三、完整代码实现
import re
def extract_domains(text):
"""
从文本中提取特定模式的域名
匹配规则:
- 以oy/ou开头
- 4个字母组成的主体
- .cc顶级域名
"""
pattern = r"""
\b # 单词边界
(oy|ou) # 匹配oy或ou开头
[a-z]{2} # 匹配任意两个小写字母
\.cc # 匹配.cc后缀
\b # 单词边界
"""
domains = re.findall(pattern, text, re.X | re.I)
return [domain.upper() + ".cc" for domain in domains]
# 测试文本
sample_text = """
访问记录:
http://oyex.cc/api?query=1
HTTPS://OYIX.CC/dashboard
无效域名:test.oyxx.com
异常格式:ouyz.cc123
有效域名:oyia.cc?param=test
"""
# 执行提取
results = extract_domains(sample_text)
print("提取到的域名:")
print('\n'.join(sorted(list(set(results)))))
四、代码解析
4.1 正则表达式详解
\b:确保完整单词匹配(oy|ou):匹配起始字符组合[a-z]{2}:匹配任意两个字母\.cc:严格匹配目标后缀
4.2 关键参数说明
re.X:允许使用注释和空白排版re.I:启用大小写不敏感匹配list(set()):去重处理
五、进阶应用示例
5.1 批量文件处理
def batch_process(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return extract_domains(content)
# 示例调用
print(batch_process('access.log'))
5.2 结果验证模块
def validate_domain(domain):
expected_domains = {
'OYEX.CC', 'OYIX.CC', 'OYIE.CC',
'OYII.CC', 'OYXE.CC', 'OYXX.CC',
'OUYY.CC', 'OUYZ.CC', 'OYIO.CC',
'OYIA.CC'
}
return domain in expected_domains
# 使用示例
for domain in results:
print(f"{domain}: {'有效' if validate_domain(domain) else '无效'}")
六、常见问题处理
6.1 子域名干扰
在正则表达式前添加(?:https?://)?(?:www\.)?可兼容URL前缀:
pattern = r"(?:https?://)?(?:www\.)?(oy|ou)[a-z]{2}\.cc"
6.2 大小写混合处理
通过upper()统一格式化,保持结果一致性:
return [domain.upper() + ".cc" for domain in domains]
七、性能优化建议
- 预编译正则表达式(适用于大数据量场景):
DOMAIN_PATTERN = re.compile(r"...", re.X)
- 使用生成器处理大型文件
- 增加缓存机制存储已知域名
八、扩展应用场景
- 安全监控:检测异常域名请求
- SEO分析:统计特定域名出现频率
- 数据清洗:规范化日志中的域名记录
九、总结
本文实现了以下目标:
- 精准提取
.cc短域名 - 处理不同大小写格式
- 兼容URL包含协议头的情况
- 提供验证和批处理功能
完整代码已托管至GitHub(示例仓库地址),读者可根据实际需求调整正则表达式中的匹配规则,例如修改[a-z]{2}为[a-z]{3}即可匹配更长字符的域名主体。
1450



被折叠的 条评论
为什么被折叠?



