2013-06-24 61 views
1

如果我有一個字符串:更好的方法從字符串中獲取多個標記? (Python 2)

「快速的棕色狐狸跳過了懶狗!

我會經常使用split()函數來標記字符串。

testString = "The quick brown fox jumps over the lazy dog!" 
testTokens = testString.split(" ") 

這會給我一個清單:

['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog!'] 

如果我想刪除第一個標記,並保持令牌的REST完整,我會做這樣的事情,使之成爲單眼線:

newString = " ".join(testTokens.split(' ')[1:]) # "quick brown fox jumps over the lazy dog!" 

或者,如果我想在一定的範圍:

newString = " ".join(testTokens.split(' ')[2:4]) # "brown fox" 
newString = " ".join(testTokens.split(' ')[:3]) # "The quick brown" 

當然,我可能要拆就不是一個空間以外的東西:

testString = "So.long.and.thanks.for.all.the.fish!" 
testTokens = testString.split('.') 

newString = ".".join(testTokens.split('.')[3:]) # "thanks.for.all.the.fish!" 

這是實現這一目標的最佳方式是什麼?還是有更高效或更可讀的方式?

+0

這對我來說很好。你的問題到底是什麼? – jterrace

+0

我不認爲你想在所有的例子中使用'testTokens.split('')'。 'testTokens'已經是'testString.split(「」)',所以你只是想按原樣使用它。 – abarnert

+0

如果你在空間上分裂,爲什麼不使用'testString.split()'來代替?它將把連續的空格作爲一個單獨的空格來處理(儘管我想你可能想保留連續的空格)。 – FastTurtle

回答

2

注意split可以採取一個可選的第二個參數,表示應該進行拆分的最大數量:

>>> testString.split(' ', 1)[1] 
'quick brown fox jumps over the lazy dog!' 

這比" ".join(testTokens.split(' ')[1:]),只要它可以應用於好得多。

謝謝@abarnert指出,如果沒有空格,.split(' ', 1)[1]會引發異常。如果出現問題,請參閱partition


此外,還有一個rsplit方法,所以你可以使用:

>>> testString.rsplit(' ', 6)[0] 
'The quick brown' 

,而不是" ".join(testTokens.split(' ')[:3])

+0

'.split('',1)[1]'唯一的問題是,如果沒有空格,它會引發異常;如果這是個問題,你可以使用'.partition('')[ - 1]'。 – abarnert

+0

@abarnert謝謝,我補充說,回答 – arshajii

+0

很好的補充'rsplit'。我不確定這是絕對最好的例子,但我相信OP可以根據你的解釋和鏈接找出它的作用和用途。 – abarnert

1

您目前的方法非常好。通過限制分割數量可以獲得非常輕微的性能提升。例如:

>>> ' '.join(testString.split(' ', 4)[2:4]) 
'brown fox' 
>>> ' '.join(testString.split(' ', 3)[:3]) 
'The quick brown' 
>>> ' '.join(testString.split(' ', 1)[1:]) 
'quick brown fox jumps over the lazy dog!' 

請注意,對於較小的字符串,差異可以忽略不計,因此您應該使用簡單的代碼。這是一個最小時間差的例子:

In [2]: %timeit ' '.join(testString.split(' ', 4)[2:4]) 
1000000 loops, best of 3: 752 ns per loop 

In [3]: %timeit ' '.join(testString.split(' ')[2:4]) 
1000000 loops, best of 3: 886 ns per loop 
+0

時間上的好點。另外,請注意,在現實生活中,他可能會將線路拆分一次(就像他在最上面一樣),然後多次使用該列表,在這種情況下可以找到所有他的用途甚至會更小,並且簡化成本更高。 – abarnert

相關問題