2017-09-19 63 views
0

我需要知道如何找到字符串中所有字母組的位置。例如,在字符串「Canyoucanacanasacannercancanacan」中,字母「an」重複7次。我想知道每個人的確切位置,可能在一個列表中。我能怎麼做?Python 2.7,我怎樣才能找到字符串中的字母組的位置?

謝謝!

+3

您可以通過編寫代碼開始並告訴我們你有什麼並不指望我們爲你做 –

+0

你到目前爲止嘗試了什麼? – JRG

+0

IMO,「an」不是**字母**,而是一個子字符串。 –

回答

0

令人驚訝的是我找不到這個問題的重複!您可以使用str.index來完成此操作,同時更新您正在查找的起始位置以排除已檢查的字符串部分。

s = 'Canyoucanacanasacannercancanacan' 
position_list = [] 
i = 0 
while True: 
    try: 
     position = s.index('an', i) 
    except ValueError: 
     break 
    position_list.append(position) 
    i = position + 1 
print(position_list) 

正如有人建議,你也可以使用str.find,像這樣:

s = 'Canyoucanacanasacannercancanacan' 
position_list = [] 
i = s.find('an') 
while i != -1: 
    position_list.append(i) 
    i = s.find('an', i+1) 
print(position_list) 
+1

你可以使用'.find',如果沒有找到,返回'-1',然後找到時循環!= -1' –

+0

好建議!我不知道我喜歡哪一個。 –

+0

好吧,關於使用'.index'的好處在於它適用於*所有序列*,所以'tuple','list','range'等 –

0

嘗試以下,如你願意,你可以修改輸出(開始和結束):

import re 

text = "Canyoucanacanasacannercancanacan" 
for m in re.finditer(r"an", text): 
    print('%02d-%02d: %s' % (m.start(), m.end(), m.group(0))) 

輸出得到:

01-03: an 
07-09: an 
11-13: an 
17-19: an 
23-25: an 
26-28: an 
30-32: an 
2

我會用re.finditer(),就像這樣:

import re 

s = "Canyoucanacanasacannercancanacan" 
pattern = "an" 

result = [m.start() for m in re.finditer(pattern, s)] 

assert result == [1, 7, 11, 17, 23, 26, 30] 

注意,這隻能找到非重疊情況下,這在您的具體情況是所有的人。

0

您可以創建一個小型發電機,以找到一個文本的字母所有位置:

def find_positions(text, letters): 
    curr = text.find(letters) 
    while curr >= 0: 
     yield curr 
     curr = text.find(letters, curr + len(letters)) 

用法:

positions = list(find_positions("Canyoucanacanasacannercancanacan", "an")) 
print(positions) 

你得到:

[1, 7, 11, 17, 23, 26, 30] 
相關問題