起因
昨天快下班时,老板临时交代做个功能:获取URL中最后的文件名,不要后缀。
对于10年编码经验的我来说,这还不简单?小意思,2分钟给你搞定!
代码敲起来
语言学过很多不算牛,能记清才算牛。
我就经常记混,每次用之前都得搜索一下,于是输入关键字“python trim”
原来,python修剪字符串前后指定字符串,没有trim,但能用strip替代。
url = '***/apple.html'
filename = url.split('/')[-1].strip('.html')
print(filename)
复制代码
输出结果:
apple
复制代码
搞定,老板可以上线了!
偶然性报错
今天一大早到公司,老板说昨天你写的那个功能有问题。
不可能啊,我敢百分百保证。
老板说,不信你自己看看。
于是我去看了下,果然发现原本以为“不可能”的错误,当出现下面这种情况时,就出错了:
url = '***/peach.html'
复制代码
结果为:
peac
复制代码
啊,怎么会?
定位
好吧,我看下哪里有问题:
url = '***/peach.html'
filename = url.split('/')[-1].strip('.html')
print(url.split('/')[-1])
print(url.split('/')[-1].strip('.html'))
复制代码
输出结果为:
peach.html
peac
复制代码
果然是strip有问题,仔细百度了一下。
原来,strip是可以从前后两端往中间方向修剪指定字符,但不按指定字符顺序,只要出现的字符都会被修剪掉,直到发现第一个非指定字符为止。
也就是说,peach.html的h.html都会被修剪掉。
解决
有一种最简单,但不严谨的做法,就是用replace替代:
url = '***/peach.html'
filename = url.split('/')[-1].replace('.html', '')
print(filename)
复制代码
不出所料,结果为正确的peach。
因为是网址,所以.html肯定出现在最后,所以用这种办法没问题,如果不是这种场景呢?
在回答这个问题之前,我不禁对一直以来深信不疑的php 的 trim函数也产生了怀疑。
于是立刻敲了起来:
<?php
$str = "peach.html";
echo trim($str,".html");
复制代码
果然,trim也是有这个问题,以上代码也是输出peac。
这个php例子先搁一边,回到python例子,如何正确地修剪指定顺序的字符串呢?
终极方案
如果是去除最左边的指定顺序字符串,可以让replace带上第三个参数(替换次数)肯定没问题:
url = 'old old peach.html'
filename = url.replace('old', '', 1)
print(filename)
复制代码
以上代码只会做一次replace,即只会删除最开头的old,会保留之后的old。
如果去除最右边的指定顺序字符串:
import re
url = '***/peach.html'
url = re.sub(r'.html$', '', url)
print(url)
复制代码
使用正则,就可以删除结尾的字符串.html
当然了,也可以使用正则去掉开头的指定字符串,读者可以自己去试一下。
欢迎关注我:
版权归原作者 键盘叔叔 所有, 如有侵权,请联系我们删除。