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

时间:2013-09-29 17:24:19

标签: python string python-2.7 text

我在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 个答案:

答案 0 :(得分:5)

这应该这样做:

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

strip()无法正常工作,因为它只会删除字符串中的任何字符(或严格来说,可以迭代)。

P.S。如果您希望能够安全地将此应用于任何字符串(即可能不以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'

答案 1 :(得分:3)

摘自lstrip的文档:

  

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

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

答案 2 :(得分:3)

这将解释我相信的一切

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

<强>输出

1pppppppppppppp
pppppppppppppp1
1

答案 3 :(得分:1)

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

来自str.strip([chars])上的docs

  

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

同样适用于str.lstripstr.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'