🔍 如何使用正则表达式从 URL 中提取域名(含端口号)
在 Web 编程、日志分析、数据清洗中,从 URL 中提取域名是一个常见且实用的操作。比如我们有这样一些地址:
-
http://www.baidu.com
-
https://abc.def.example.com:8080/index.html
我们希望能从中准确提取出主机名部分(如 www.baidu.com
、abc.def.example.com:8080
)。这时候,使用 Python 的 re
模块配合正则表达式就是最佳选择。
🧠 域名构成要素简析
在构造正则前,我们需要理解一个标准域名可能包含哪些部分:
-
主机名:如
www.
-
二级/三级域名:如
abc.def.
-
顶级域名:如
.com
-
可选端口号:如
:8080
英文域名允许出现的字符包括:
-
英文字母(大小写)
-
数字(0-9)
-
连字符
-
-
点号
.
-
可选的端口(如
:443
)
✅ 正则表达式示例
下面是一个用于提取 URL 中域名部分的正则表达式:
re.search(r'http(s)?://([\w\-\.]+)\w+(:\d{1,5})?', url)
Python📌 正则含义逐步拆解:
-
http(s)?://
:匹配以 http:// 或 https:// 开头的协议头 -
([\w\-\.]+)
:匹配由字母、数字、下划线、连字符、点号组成的主机名 -
\w+
:确保末尾是合法域名字符(避免以点号或破碎字符结尾) -
(:\d{1,5})?
:匹配可选的端口号,如:80
、:443
🧪 实战测试代码
import re
url = "https://abc.def.example.com:8080/index.html"
match = re.search(r"http(s)?://([\w\-\.]+\w+)(:\d{1,5})?", url)
if match:
domain = match.group(2)
port = match.group(3) if match.group(3) else "默认端口"
print(f"提取到的域名:{domain}")
print(f"端口信息:{port}")
else:
print("URL格式不正确")
Python输出:
提取到的域名:abc.def.example.com
端口信息::8080
ini✅ 总结
通过正则表达式,可以高效从 URL 中提取域名、端口等关键字段,非常适合用于:
-
日志分析(提取来源域)
-
数据清洗(统一格式)
-
安全检测(识别来源主机)
当然,如果你的 URL 更复杂(含用户名密码、锚点参数等),建议使用 urllib.parse
模块进行更精细解析。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
本文暂时没有评论,来添加一个吧(●'◡'●)