I need to extract file extension from Three type of direct and indirect URL.

"https://needmode.com/products/350e0f54c3480dc035d6db5e7ef898711d5f4ebc_1683455668.jpg"

"https://dkstatics-public.digikala.com/digikala-products/350e0f54c3480dc035d6db5e7ef898711d5f4ebc_1683455668.jpg?x-oss-process=image/resize,m_lfit、h_800、w_800/质量、Q_90"

"https://meghdadit.com/_image.ashx?i=%252ffiles%252fproduct%252f4778c8kbqjb7k18sqydnkztp4yzi0jlaug5j5jtybsmuw0lzq2%255blarge%255d.jpg"

我的目标是在所有类型的URL中返回"jpg"作为文件扩展名.

我的python代码如下:

from urllib.parse import urlparse
import os
img = "IMAGE URL"
parsed_url = urlparse(img)
filename_and_extension = parsed_url.path.rsplit("/", maxsplit=1)[-1]
file_extension = parsed_url.path.rsplit(".", maxsplit=1)[-1].lower()
print("first method: "+file_extension)
filename, file_extension = os.path.splitext(img)
print("second method: "+file_extension)

第一种方法不适用于第三个URL,第二种方法不适用于第二个URL.

有没有办法对从URL右侧 Select 扩展名的第一种方法进行优先排序?

推荐答案

如果您有一个有效扩展名列表,那么搜索这些扩展名可能比try 解析整个URL更容易.维基百科似乎有一个非常、非常广泛的已知扩展列表:

https://en.wikipedia.org/wiki/List_of_filename_extensions

如果你使用维基百科的上述表格来生成你自己的有效扩展名列表,你可以使用几种不同的方法,因为你在某种程度上知道所有可能的答案.我是Regex的粉丝(假设你有一长串潜在的扩展),但不是每个解决方案都必须使用needs正则表达式.假设您有一个.txt文件,其中包含了您要在不同行中查找的所有扩展名

import re
extList = open("path/to/.txt").readlines()

# Just to make sure no whitespace is included --> Could also use str.strip()
extList = [re.sub(r"\s","",ext) for ext in extList]

# Pipe (|) represents OR in regex. (?i) Enables IGNORE_CASE
regString = "|".join(extList)

# Use list of Ext's, preceded by '.', to find potential matches
regExtensions = re.compile(rf"(?i)\.(?:{regString})") # "(?i)\.(?:PNG|JPG|DOC.....)"

这将与上面提到的扩展匹配.此处显示的示例:https://regex101.com/r/drTCEY/1

然后,您可以从给定的字符串url中提取扩展名:

ext = regExtensions.findall(url)[0]

然而,这个正则表达式可以改进以排除误报,但这将取决于URL的一致性.在提供的示例中,扩展名后面似乎是字符串末尾或"?",这可以添加到正则表达式中,如下所示: regExtensions = re.compile(rf"(?i)\.(?:{regString})(?=$|\n|\?)"),但这将再次取决于您正在使用的URL模式.

最后,如果要将.从匹配中排除,请将该字符设置为后视,而不是作为匹配的一部分,设置为:

regExtensions = re.compile(rf"(?i)(?<=\.)(?:{regString})")

Python相关问答推荐

线性模型PanelOLS和statmodels OLS之间的区别

运行回文查找器代码时发生错误:[类型错误:builtin_index_or_system对象不可订阅]

Django mysql图标不适用于小 case

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

使用@ guardlasses. guardlass和注释的Python继承

Python—从np.array中 Select 复杂的列子集

Python+线程\TrocessPoolExecutor

在两极中过滤

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

并行编程:同步进程

如何在Gekko中使用分层条件约束

如何删除重复的文字翻拍?

仅使用预先计算的排序获取排序元素

按条件添加小计列

Python如何导入类的实例

将标签与山脊线图对齐

删除另一个div中的特定div容器

在Django REST框架中定义的URL获得404分

Pandas 数据框自定义排序功能