str.lstrip()的意外行为

4

我正在做一个scrapy项目,试图解析我的配置文件

字符串是attr_title,我需要去掉"attr_"并得到title。我使用了lstrip('attr_'),但是结果出乎意料。我知道lstrip会处理组合并将其删除,但是很难理解。

In [17]: "attr.title".lstrip('attr.')
Out[17]: 'itle'

PS: 我知道有多种方法可以提取我感兴趣的字符串,但我想了解这个过程。


2个回答

9

lstrip会迭代结果字符串,直到找不到与最左侧字符集匹配的组合为止。

以下是一个小例子。

In [1]: "attr.title".lstrip('attr.')
Out[1]: 'itle'  # Flow --> "attr." --> "t" --> Next char is 'i' which does not match any combination hence, iteration stops & end result ('itle') is returned

In [2]: "attr.tritle".lstrip('attr.')
Out[2]: 'itle' # "attr." --> "t" --> "r" --> Next char is 'i' which does not match any combination hence, iteration stops & end result ('itle') is returned

In [5]: "attr.itratitle".lstrip('attr.')
Out[5]: 'itratitle' # "attr." --> Next char is 'i' which does not match any combination hence, iteration stops & end result ('itratitle') is returned

谢谢您的解释和示例说明。这有助于更好地理解。 - geetha ar
3
这并没有涉及到递归。 - Tim Pietzcker
2
递归必须在语法上下文中理解...由于OP难以理解,我进一步解释了它。 - kumar
正如Tim所说,strip方法不会递归操作 - 它们使用简单的while循环。如果您说“lstrip在输入字符串上进行迭代操作”,则您的解释将更准确。有关详细信息,请参见do_argstrip()(从第1882行开始)的源代码 - PM 2Ring

5
"attr.title".lstrip('attr.')

意思是从给定字符串的左边删除每个 attr. 直到不存在这样的字符为止。然后它将给定字符串并移除 a,两个 tr.t,因为它们都包含在给定的模式中。当遇到 i 时停止,因为它不包含在模式中。

谢谢你的解释,啊哈,现在我明白了。 - geetha ar
1
@geethaar:不幸的是,与 .startswith() 方法不同,.lstrip() 不接受 tuple() 参数(以剥离整个字符串而不是单个字符)。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接