2013-09-29 75 views
1

我有一個字符串在Python 2.7文本操作的令人驚訝的輸出,當包含「#」

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

,我想從它的開始剝離「路徑#」。 當我使用lstrip它結束了奇怪的輸出與一個額外的'p'剝離。的

s2 = s1.lstrip('path#') 

輸出是

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

代替

它完全適用於其他實施例,如:

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

其被正確地剝離到:

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

爲什麼python會從字符串中剝離額外的字母?

+2

'.lstrip(S)'去除了's'的所有字符;它不會刪除**字符串**'s'。 '「xxxxxxxxy」.lstrip('x')==「y」'。 –

+0

1)它與'#'無關' 2)'strip'或'lstrip'或'rstrip'正在刪除字符而不是子字符串。這些功能的輸入將表現得像單個字符 –

回答

5

這應做到:

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

strip()不起作用,因爲它只是刪除字符串中找到的任何字符(或迭代,嚴格說話)你傳遞給它。

P.S.如果您希望能夠安全地將其應用於任何字符串(即從lstrip文檔

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' 
+0

但是爲什麼會出現問題?這真有趣。 –

+0

我明白了。它會從我的字符串中刪除任何單個'p','a','t','h'和'#'。 –

+0

謝謝@Erik Allik –

1

不,這不奇怪。 str.strip不會刪除前綴或後綴,它將刪除傳遞給它的所有字符組合。

docsstr.strip([chars])

返回去除了開頭和結尾字符 字符串的副本。參數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' 
3

摘錄:可能不是path#開始字符串),這樣做:

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

甚至

返回與領先的字符串的副本刪除了字符。字符 參數是一個字符串,指定要刪除的字符集。

你當作參數傳遞的字符是一個集合,因爲'p'是它的一部分,它會刪除'p'你缺少。

+0

謝謝@Michael –

3

這將說明一切,我相信

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

輸出

1pppppppppppppp 
pppppppppppppp1 
1