请大神帮忙看看
>>> a = 'https://imgsa.baidu.com/forum/w%3D580/sign=d7ec98bcb80e7bec23da03e91f2fb9fa/f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg'>>> filename = a.split('/')
>>> filename
['https:', '', 'imgsa.baidu.com', 'forum', 'w%3D580', 'sign=d7ec98bcb80e7bec23da03e91f2fb9fa', 'f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg'] # 第二个返回结果不应该是'/'吗?
>>> filename = a.split('/')
>>> filename
'' # 结果不应该是'/'吗?
应该是涉及到转义字符吧?没理解 在这个例子中,您使用 `split('/')` 函数将字符串 `a` 按照 `/` 字符进行分割。但需要注意的是,分割后的结果中并不会包含分隔符(`/`),所以在输出的列表中并不会出现 `/` 字符。
分割后的结果列表 `filename` 中的第二个元素是一个空字符串,因为在原始字符串 `a` 中有两个连续的 `/` 字符。当 `split()` 函数遇到这两个连续的分隔符时,它会在分割结果列表中插入一个空字符串。所以在这个例子中,第二个元素不会是 `/`,而是一个空字符串 `''`。
这个问题跟转义字符无关。转义字符是用于表示那些在字符串中无法直接表示的字符,例如换行符 `\n` 和制表符 `\t`。在这个例子中,`/` 字符本身是可以直接表示的,不需要转义。 本帖最后由 lzb1001 于 2023-4-25 22:06 编辑
isdkz 发表于 2023-4-25 21:49
在这个例子中,您使用 `split('/')` 函数将字符串 `a` 按照 `/` 字符进行分割。但需要注意的是,分割后的结 ...
做了大量的测试如下:
>>> a = 'lzzb'
>>> filename = a.split('z') # 理解(道理同上)
>>> filename
['l', '', 'b']
>>> filename = a.split('zz') # 理解
>>> filename
['l', 'b']
>>> a = 'lzb'
>>> filename = a.split('z') # 理解
>>> filename
['l', 'b']
>>> filename = a.split('zz') # 不理解
>>> filename
['lzb']
>>> filename = a.split('zzz') # 不理解
>>> filename
['lzb']
>>> a = 'lzzzb'
>>> filename = a.split('z') # 不理解
>>> filename
['l', '', '', 'b']
>>> filename = a.split('zz') # 理解
>>> filename
['l', 'zb']
>>> filename = a.split('zzz') # 理解
>>> filename
['l', 'b']
本帖最后由 sfqxx 于 2023-4-25 22:06 编辑
是的,这里涉及到了URL中的转义字符。在URL中,某些字符是有特殊意义的,例如斜杠(/)表示路径分隔符,而百分号(%)则用于表示转义字符。
在这个例子中,原始字符串a中包含了一个经过URL编码的斜杠(%2F),它被解释成了一个路径分隔符。所以使用split()方法将a分割成多个部分时,第二个部分就是空字符串(因为它前面有个分隔符)。
如果想要得到正确的文件名,可以使用urllib库中的unquote()函数来解码URL:
import urllib.parse
a = 'https://imgsa.baidu.com/forum/w%3D580/sign=d7ec98bcb80e7bec23da03e91f2fb9fa/f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg'
filename = urllib.parse.unquote(a).split('/')[-1]
print(filename)# 输出 f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg
这样可以确保解析出来的文件名是正确的,不受URL编码的影响。
p有用请设置最佳答案 lzb1001 发表于 2023-4-25 22:04
做了大量的测试如下:
>>> a = 'lzzb'
这些测试结果是根据 Python 中 `split()` 函数的工作原理得到的,我会逐个解释这些结果。
1. 当您在 `a = 'lzzb'` 的基础上执行 `a.split('z')` 时,它会在每个 'z' 的地方进行分割,因此您会得到 `['l', '', 'b']`。
2. 对于 `a.split('zz')`,它会在 'zz' 的地方进行分割,因此得到 `['l', 'b']`。
3. 当 `a = 'lzb'` 时,执行 `a.split('z')` 可得到 `['l', 'b']`,这是很直观的。
4. 对于 `a.split('zz')` 和 `a.split('zzz')`,由于字符串中都不存在 'zz' 或 'zzz',所以分割操作不会进行,结果仍然是原字符串,即 `['lzb']`。
5. 当 `a = 'lzzzb'` 时,执行 `a.split('z')` 将在每个 'z' 处进行分割,得到 `['l', '', '', 'b']`。请注意,当有连续的分隔符时(在这里是三个连续的 'z'),`split()` 函数会在分割结果列表中插入一个空字符串。
6. 对于 `a.split('zz')`,它会在 'zz' 的地方进行分割(只有一处),因此得到 `['l', 'zb']`。
7. 最后,对于 `a.split('zzz')`,由于字符串中存在一个 'zzz',所以在该处进行分割,得到 `['l', 'b']`。 是的,这里涉及到了转义字符。在Python字符串中,'/'是一个特殊的字符,用于表示路径的分隔符。因此,在对字符串进行split操作时,需要使用'/'的转义形式'\/'。修改代码如下:
a = 'https://imgsa.baidu.com/forum/w%3D580/sign=d7ec98bcb80e7bec23da03e91f2fb9fa/f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg'
filename = a.split('\/')[-1] # -1表示获取最后一个元素
print(filename)
输出结果为:f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg 陶远航 发表于 2023-4-29 17:09
是的,这里涉及到了转义字符。在Python字符串中,'/'是一个特殊的字符,用于表示路径的分隔符。因此,在对 ...
刚按大神你说的测试了下不对啊,反而filename = a.split('/')[-1]才是对的,请看:
>>> a = 'https://imgsa.baidu.com/forum/w%3D580/sign=d7ec98bcb80e7bec23da03e91f2fb9fa/f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg'
>>> filename = a.split('/')[-1]
>>> print(filename)
f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg
>>> filename = a.split('\/')[-1]
>>> print(filename)
https://imgsa.baidu.com/forum/w%3D580/sign=d7ec98bcb80e7bec23da03e91f2fb9fa/f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg
页:
[1]