包含'#'时文本操作的输出令人惊讶

Ehs*_*adi 1 python string text python-2.7

我在python 2.7中有一个字符串

s1='path#poss|<-poss<-home->prep->in->pobj->|pobj'
Run Code Online (Sandbox Code Playgroud)

我想 从它的开头删除'path#'.当我使用lstrip时,它会以奇怪的输出结束,并带有额外的'p'剥离.的输出

s2 = s1.lstrip('path#')
Run Code Online (Sandbox Code Playgroud)

'oss|<-poss<-home->prep->in->pobj->|pobj'
Run Code Online (Sandbox Code Playgroud)

代替

'poss|<-poss<-home->prep->in->pobj->|pobj'
Run Code Online (Sandbox Code Playgroud)

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

'path#nsubj|<-nsubj<-leader->prep->of->pobj->|pobj'
Run Code Online (Sandbox Code Playgroud)

正确剥离到:

'nsubj|<-nsubj<-leader->prep->of->pobj->|pobj'
Run Code Online (Sandbox Code Playgroud)

为什么python从字符串中剥离出额外的字母?

Eri*_*lun 5

这应该这样做:

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

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

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

if s1.startswith(prefix_to_strip):
    s1 = s1[len(prefix_to_strip):]
Run Code Online (Sandbox Code Playgroud)

甚至:

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'
Run Code Online (Sandbox Code Playgroud)