2015-04-03 145 views
-2

我在寫一個加載電影的外部txt文件的程序。這部分工作正常。然後我有一個功能,可以搜索從文件生成的電影列表。該功能應打印出以搜索字符串開頭的所有電影。Python:startswith()不按預期工作

def startsWithSearch(movieList): 

    searchString = input("Enter search string: ") 

    for movie in movieList: 
     if(movie.startswith(searchString) == True): 
     print(movie) 

但是,當輸入搜索字符串時,即使列表中有以該字符串開頭的影片,也不會打印影片。

+2

那麼,什麼是'正是movieList'?你不需要做'== True','if'*已經*測試了。 – 2015-04-03 21:05:57

+0

'movie.startswith()'需要在字符串開始時進行精確(區分大小寫!)匹配。沒有關於你輸入什麼的細節以及你在'movieList'中給出了什麼值,我們無法幫助你找出值不匹配的地方。使用'repr()'或'ascii()'產生的輸出可以幫助你調試像這樣的問題:'print(repr(searchString))'和'print(repr(movie))'應該使它更加可見多少字符串確實匹配。 – 2015-04-03 21:08:19

+0

縮進看起來破損,我想'print'語句應該比'if'縮進得更遠。你發佈了實際的代碼嗎? – 2015-04-03 21:18:31

回答

1

如果給予正確的輸入數據的功能確實如預期工作:

def startsWithSearch(movieList): 

    searchString = "test4" 

    for movie in movieList: 
     if(movie.startswith(searchString)): 
      print(movie) 


startsWithSearch(["test1","testnomatch","test4","test4should","not_test4"]) 

輸出爲:

test4 
test4should 

所以正確的......一定是你的輸入數據

我知道你想要一個StartsWith解決方案作爲你的函數名稱說,但實際上搜索電影,這是一個更方便,如果你發現任何匹配內的字符串,所以如果我搜索「思想家」,我會尋找「超感警探」,那麼你可以只使用:

if searchString in movie: 
    print(movie) 

而安娜的建議忽略大小寫:

if searchString.lower() in movie.lower(): 

甚至用正則表達式票友(需要import re在第一行):

if re.match(".*" + searchString,movie,re.I): 

,或者如果你真的只是想匹配名字的開頭:

if re.match(searchString,movie,re.I): 

,應該是足夠的選擇:)

+0

您可能還需要不區分大小寫的搜索;一個簡單的方法就是檢查'movie.lower()中的searchString.lower():''' – Gretchen 2015-04-03 22:30:36

+0

@Anna增加了你的建議,另一個正則表達式變體 – 2015-04-03 22:46:43

0

我認爲這可能是該input()功能,並在最後一個新行返回。收集輸入數據後嘗試添加searchString = searchString.strip()。 也可以在比較之前嘗試將兩者都轉換爲小寫。

還行if(movie.startswith(searchString) == True):正好可以寫爲if movie.startswith(searchString):

+0

'input'自己去掉最後的換行符。這不是問題。 – 2015-04-03 23:19:10