Python中如何使用正则表达式匹配URL最后的文件名
例如:例如: https://cn.bing.com/az/hprichbg/rb/SphinxObservatory_ZH-CN7733546261_1920x1080.jpg
目标匹
目标匹配:SphinxObservatory_ZH-CN7733546261_1920x1080.jpg
我是这样匹配的:r’/(.*?.jpg)'
结果匹配的是:/cn.bing.com/az/hprichbg/rb/SphinxObservatory_ZH-CN7733546261_1920x1080.jpg
查了一下非贪婪匹配的问题,加不加“?”结果都一样,谁能指导一下
Python中如何使用正则表达式匹配URL最后的文件名
import re
def extract_filename_from_url(url):
"""
从URL中提取文件名(包含扩展名)
参数:
url (str): 完整的URL字符串
返回:
str: 文件名(如果找到),否则返回None
"""
# 正则表达式模式
pattern = r'/([^/?#]+)(?=[?#]|$)'
# 查找匹配
match = re.search(pattern, url)
if match:
return match.group(1)
return None
# 测试示例
test_urls = [
"https://example.com/path/to/file.txt",
"https://example.com/image.jpg?width=200&height=300",
"https://example.com/document.pdf#page=2",
"https://example.com/",
"https://example.com/path/to/file.tar.gz",
"https://example.com/file_with_underscores.py",
"https://example.com/file-with-dashes.html",
"https://example.com/file123_v2.1.0.zip"
]
print("URL文件名提取测试:")
for url in test_urls:
filename = extract_filename_from_url(url)
print(f"URL: {url}")
print(f"文件名: {filename}")
print("-" * 50)
代码解释:
-
正则表达式模式
r'/([^/?#]+)(?=[?#]|$)':/:匹配斜杠(路径分隔符)([^/?#]+):捕获组,匹配一个或多个非/、?、#的字符(?=[?#]|$):正向预查,确保后面是?、#或字符串结尾
-
关键点:
- 正确处理查询参数(
?之后的内容) - 正确处理片段标识符(
#之后的内容) - 支持各种文件名格式(包含点、下划线、连字符等)
- 正确处理查询参数(
-
使用示例:
# 基本使用
url = "https://example.com/docs/report.pdf"
filename = extract_filename_from_url(url) # 返回 "report.pdf"
# 带查询参数的URL
url2 = "https://example.com/image.png?size=large"
filename2 = extract_filename_from_url(url2) # 返回 "image.png"
一句话总结:用/([^/?#]+)(?=[?#]|$)这个正则就能准确提取URL末尾的文件名。
os.path.basename(url) (逃…
os.path.basename(url)
(逃…
.split("//")[-1]
.split(r"/")[-1]
[^/]+.\w+$
??
[^/]+$
???
都能匹配到,看来是我思路不对了
为什么要用正则?
自己不熟悉,正则学习的最早,就最先想到了,leoleoasd 的方法好像最简单
看你是不是从大批量网址里面匹配了,
如果只是一条记录,感觉就没必要用正则了。。。
如果是匹配某个网页里面的全部图片名还是比较有效的。
(?!./)..jpg
为什么不用 url 对象或者是 path 对象
.split(r"/")[-1]
[^/]+$
😂

