1

我在 python 2.7 中有一个字符串

s1='path#poss|<-poss<-home->prep->in->pobj->|pobj'

我想从它的开头删除'path#' 。当我使用lstrip时,它会以奇怪的输出结束,并去除一个额外的“p”。的输出

s2 = s1.lstrip('path#')

'oss|<-poss<-home->prep->in->pobj->|pobj'

代替

'poss|<-poss<-home->prep->in->pobj->|pobj'

它非常适用于其他示例,例如:

'path#nsubj|<-nsubj<-leader->prep->of->pobj->|pobj'

正确剥离为:

'nsubj|<-nsubj<-leader->prep->of->pobj->|pobj'

python 为什么要从字符串中去除多余的字母?

4

4 回答 4

5

这应该这样做:

prefix_to_strip = 'path#'
s1 = 'path#poss|<-poss<-home->prep->in->pobj->|pobj'
s1 = s1[len(prefix_to_strip):]

strip()不起作用,因为它只是删除了在您传递给它的字符串(或者,严格来说是可迭代的)中找到的任何字符。

PS如果您希望能够安全地将其应用于任何字符串(即可能不以开头的字符串path#),请执行以下操作:

if s1.startswith(prefix_to_strip):
    s1 = s1[len(prefix_to_strip):]

甚至:

def strip_prefix(prefix, string):
    return string[len(prefix):] if string.startswith(prefix) else string

strip_prefix('foo#', 'foo#bar')  # => 'bar'
strip_prefix('foo#', 'hello')  # => 'hello'
于 2013-09-29T17:27:33.727 回答
3

摘自lstrip的文档:

返回删除了前导字符的字符串的副本。chars 参数是一个字符串,指定要删除的字符集。

您作为参数传递的字符是一个集合,由于'p'是它的一部分,它将删除'p'您缺少的字符。

于 2013-09-29T17:28:38.490 回答
3

这将解释我所相信的一切

s1 = 'pppppppppppppp1pppppppppppppp'
print s1.lstrip("path#")
print s1.rstrip("path#")
print s1.strip("path#")

输出

1pppppppppppppp
pppppppppppppp1
1
于 2013-09-29T17:35:25.800 回答
1

不,这并不奇怪。str.strip不会删除前缀或后缀,它会删除传递给它的所有字符组合。

文档开始str.strip([chars])

返回删除了前导和尾随字符的字符串的副本。chars参数是一个字符串,指定要删除的字符集。如果省略或无,chars 参数默认删除空格。chars参数 不是前缀后缀;相反,它的值的所有组合都被剥离:

同样的事情也适用于str.lstripand str.rstrip

使固定:

>>> s1 = 'path#poss|<-poss<-home->prep->in->pobj->|pobj'
if s1.startswith('path#'):
   s2 = s1[len('path#'):]
>>> s2
'poss|<-poss<-home->prep->in->pobj->|pobj'
于 2013-09-29T17:25:55.753 回答