2015-04-03 146 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