Python实现URL规范化:为无后缀无尾斜杠的URL添加尾斜杠
URL规范化:为无扩展名且无末尾斜杠的URL添加斜杠
问题描述
我需要在Python中实现URL规范化:当URL未以斜杠结尾,且末尾部分没有文件扩展名(比如.png、.php这类)时,自动为其添加末尾斜杠。例如:
http://www.example.com→http://www.example.com/http://www.example.com/image.png→ 保持不变
但我用正则表达式/([^/.]+)$写的代码没生效,start_url完全没被修改:
import re start_url = "https://zonetuto.fr" start_url = re.sub(r'/([^/.]+)$', r'/\1/', start_url) print(start_url)
问题原因
你的正则表达式要求匹配以斜杠开头、后面跟着不含点和斜杠的字符结尾的模式,但https://zonetuto.fr的末尾是zonetuto.fr,前面没有斜杠,自然匹配不到,所以re.sub不会做任何替换。
解决方案
方案1:改进正则逻辑
直接判断URL是否满足「未以斜杠结尾」且「末尾无扩展名」两个条件,再添加斜杠:
import re def normalize_url(url): # 先排除已以斜杠结尾的情况 if url.endswith('/'): return url # 检查末尾是否有文件扩展名(匹配类似 .xxx 的格式) if not re.search(r'\.\w+$', url): return url + '/' return url # 测试用例 print(normalize_url("https://zonetuto.fr")) # 输出: https://zonetuto.fr/ print(normalize_url("http://www.example.com/image.png")) # 输出: http://www.example.com/image.png print(normalize_url("https://test.com/path/to/page")) # 输出: https://test.com/path/to/page/ print(normalize_url("https://test.com/index.php")) # 输出: https://test.com/index.php print(normalize_url("https://test.com/path/")) # 输出: https://test.com/path/
方案2:用标准库urllib.parse处理复杂URL
如果需要处理带查询参数、锚点的复杂URL,用Python标准库解析更严谨,避免正则的局限性:
from urllib.parse import urlparse, urlunparse def normalize_url(url): parsed_url = urlparse(url) path = parsed_url.path # 处理路径:非空、未以斜杠结尾、且最后一段无扩展名 if path and not path.endswith('/') and '.' not in path.split('/')[-1]: path += '/' # 重新拼接URL return urlunparse(parsed_url._replace(path=path)) # 测试用例 print(normalize_url("https://zonetuto.fr")) # 输出: https://zonetuto.fr/ print(normalize_url("http://www.example.com/image.png?size=200")) # 输出: http://www.example.com/image.png?size=200 print(normalize_url("https://test.com/page#top")) # 输出: https://test.com/page/#top print(normalize_url("https://test.com/api/v2")) # 输出: https://test.com/api/v2/
内容的提问来源于stack exchange,提问作者LeMoussel
相关产品推荐
相关产品推荐

