鱼C论坛

 找回密码
 立即注册
查看: 2142|回复: 6

[已解决]请大神帮忙看看

[复制链接]
发表于 2023-4-25 21:47:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> 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('/')[1]
>>> filename
'' # 结果不应该是'/'吗?

应该是涉及到转义字符吧?没理解
最佳答案
2023-4-25 22:20:04
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']`。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-25 21:49:43 | 显示全部楼层
在这个例子中,您使用 `split('/')` 函数将字符串 `a` 按照 `/` 字符进行分割。但需要注意的是,分割后的结果中并不会包含分隔符(`/`),所以在输出的列表中并不会出现 `/` 字符。

分割后的结果列表 `filename` 中的第二个元素是一个空字符串,因为在原始字符串 `a` 中有两个连续的 `/` 字符。当 `split()` 函数遇到这两个连续的分隔符时,它会在分割结果列表中插入一个空字符串。所以在这个例子中,第二个元素不会是 `/`,而是一个空字符串 `''`。

这个问题跟转义字符无关。转义字符是用于表示那些在字符串中无法直接表示的字符,例如换行符 `\n` 和制表符 `\t`。在这个例子中,`/` 字符本身是可以直接表示的,不需要转义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-25 22:04:07 | 显示全部楼层
本帖最后由 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']

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-25 22:04:44 | 显示全部楼层
本帖最后由 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有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-25 22:20:04 | 显示全部楼层    本楼为最佳答案   
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']`。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 17:09:51 | 显示全部楼层
是的,这里涉及到了转义字符。在Python字符串中,'/'是一个特殊的字符,用于表示路径的分隔符。因此,在对字符串进行split操作时,需要使用'/'的转义形式'\/'。修改代码如下:
a = 'https://imgsa.baidu.com/forum/w%3D580/sign=d7ec98bcb80e7bec23da03e91f2fb9fa/f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg'
filename = a.split('\/')[-1] # -1表示获取最后一个元素
print(filename)
输出结果为:f5d6277f9e2f0708c6d5a6b3e924b899a801f2b6.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-2 21:00:49 | 显示全部楼层
陶远航 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表