有意思的 lstrip 和 removeprefix(Python 3.9)
废话不多说,上正文。对比Python 3.9 的新特性中,有两个新的字符串方法:str.removeprefix(prefix, /)、str.removesuffix(suffix, /),前者是去除前缀,后者是去除后缀。ěi~,是不是感觉似曾相识,这不就是 lstrip()、rstrip() 的功能吗?还真不是。来看一个对比:>>> '今天天气不错'.removeprefix
废话不多说,上正文。
对比
Python 3.9 的新特性中,有两个新的字符串方法:str.removeprefix(prefix, /)
、str.removesuffix(suffix, /)
,前者是去除前缀,后者是去除后缀。
ěi~,是不是感觉似曾相识,这不就是 lstrip()
、rstrip()
的功能吗?还真不是。
来看一个对比:
>>> '今天天气不错'.removeprefix('今天')
'天气不错'
>>> '今天天气不错'.lstrip('今天')
'气不错'
🤔是不是挺奇怪,我估计可能坑了很多人。下面来看下为什么 lstrip()
会出现这样的结果。
Why
首先需要说明的是,lstrip([chars])
这样的行为,是一个 feature,不是一个 bug。
看下文档是怎么说的:
Return a copy of the string with leading characters removed. The chars argument is a string specifying the set of characters to be removed. The chars argument is not a prefix; rather, all combinations of its values are stripped:
也就是说,其参数 chars
虽然是一个字符串,但不是直接去除字串形式的 chars
,而是在从左到右遍历原字符串,去除在 chars
中的字符,直到遇到第一个不在 cahrs
中的字符为止,即类似如下实现:
def lstrip(s, chars):
chars = set(chars)
for i in s:
if i in chars:
s = s.replace(i, '')
else:
break
return s
>>> lstrip('今天天气不错', '今天')
'气不错'
有时候可能这并不是我们想要的情况(可能大多数情况都不是),我们想要的是可能是下面这样的效果:
def lstrip(s, chars):
if s.startswith(chars):
return s[len(chars):]
return s
>>> lstrip('今天天气不错', '今天天气')
'天气不错'
而 Python 3.9,就直接内置了这个方法,命名为 removeprefix()
,后面如果我们想要去除前缀而不是前缀所包括的那些字符的时候,就可以直接用了:
>>> '今天天气不错'.removeprefix('今天')
'天气不错'
Reference
- PEP 616 – String methods to remove prefixes and suffixes | Python.org
- Built-in Types — Python 3.9.0b1 documentation
- Mailman 3 [Python-ideas] Re: New explicit methods to trim strings - Python-ideas - python.org
- issue 39880: string.lstrip() with leading '3’s - Python tracker
- Understanding python’s lstrip method on strings - Stack Overflow
- New Features in Python 3.9 You Should Know About - Martin Heinz
- Python Release Python 3.9.0b1 | Python.org
END
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)