str.lstrip() 的意外行为

12 浏览
0 Comments

str.lstrip() 的意外行为

我正在进行一个scrapy项目,并尝试解析我的配置。字符串是attr_title,我需要去掉'attr_'并得到title。我使用了lstrip('attr_'),但得到了意外的结果。我知道lstrip会找到组合并删除它们,但我很难理解它的工作原理。

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

附注:我知道有多种方法可以提取我感兴趣的字符串,我只想理解这个方法。

0
0 Comments

str.lstrip()方法是Python中的一个字符串方法,用来去除字符串左边指定的字符或字符序列。然而,使用lstrip()方法时可能会出现一些意外的行为。

例如,我们有一个字符串"attr.title",我们想要去除字符串左边的"attr."这个字符序列。我们可以使用lstrip()方法来实现这个目的,代码如下:

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

根据lstrip()方法的定义,它会从字符串的左边开始,去除指定字符序列中的每一个字符,直到没有这样的字符出现为止。然后它会取得到的字符串,并从中删除指定的字符序列。在这个例子中,它会删除"a"、两个"t"、"r"、"."和"t",因为它们都包含在指定的模式中。

然而,在这个例子中,lstrip()方法只删除了"attr."这个字符序列的第一个字符"a",并没有删除后面的"t"、"t"、"r"、"."和"t"。这是因为lstrip()方法只会删除指定字符序列中的每一个字符,而不会删除整个字符序列。

为了解决这个问题,我们可以使用startswith()方法来替代lstrip()方法。startswith()方法可以接受一个元组作为参数,用来指定多个字符序列。它会从字符串的开头开始,检查是否以元组中任何一个字符序列开头,并返回相应的结果。

不幸的是,与startswith()方法不同,lstrip()方法不接受元组作为参数,无法一次性删除多个字符序列。然而,我们可以使用多个lstrip()方法来实现相同的效果,代码如下:

"attr.title".lstrip('attr.').lstrip('t').lstrip('r').lstrip('.')

通过多次使用lstrip()方法,我们可以依次删除每个字符序列,以达到我们想要的结果。

总结起来,str.lstrip()方法的意外行为是因为它只能删除指定字符序列中的每一个字符,而无法删除整个字符序列。要解决这个问题,我们可以使用startswith()方法或多次使用lstrip()方法来实现相同的效果。

0
0 Comments

问题的原因是`lstrip`方法在迭代结果字符串时,直到没有匹配最左边的字符集的组合为止。解决方法是使用`strip`方法来替代`lstrip`方法,因为`strip`方法不会出现这个问题。

`lstrip`方法的工作原理是从左边开始迭代字符串,直到找到一个字符或字符集合,该字符或字符集合不再匹配给定的字符集。然后,`lstrip`方法返回从该字符或字符集合位置开始的剩余字符串。

下面是一些示例说明:

In [1]: "attr.title".lstrip('attr.')
Out[1]: 'itle'
In [2]: "attr.tritle".lstrip('attr.')
Out[2]: 'itle'
In [5]: "attr.itratitle".lstrip('attr.')
Out[5]: 'itratitle'

通过上面的示例,我们可以看到`lstrip`方法的迭代过程。它首先匹配字符集合"attr.",然后继续匹配下一个字符。如果下一个字符不再匹配给定的字符集,迭代停止并返回结果字符串。

感谢解释和示例说明。这有助于更好地理解问题。

需要注意的是,这个问题并没有递归的过程。"递归"这个词必须在语法上下文中理解。正如问题解释中所说,`strip`方法不会递归地操作,它们使用一个简单的`while`循环。如果要更准确地解释,可以说`lstrip`方法在输入字符串上进行迭代操作。

如果想要了解更多细节,可以查看`do_argstrip()`方法的源代码(从第1882行开始)。

总结起来,`str.lstrip()`方法的意外行为是因为它在迭代结果字符串时,只匹配最左边的字符集合。为了解决这个问题,可以使用`str.strip()`方法来替代`str.lstrip()`方法。

0