Python大小写不敏感匹配代码问题:列表推导返回空列表
问题分析与解决方案
嘿,我一眼就看出问题出在哪了——你现在的代码是在遍历字符串的单个字符,但你要匹配的是用户输入的整个字符串(比如"charl"),单个字符和完整字符串当然不可能相等,所以列表推导返回空列表是必然的。
核心问题拆解
看你的代码:
self.varStr =[i for i in textString if i.lower() == x.lower()]
如果textString是从文件读出的完整文本(比如包含"Charles"的字符串),那么for i in textString会逐个取出每个字符:'C'、'h'、'a'、'r'、'l'、'e'、's'... 而用户输入的x是"charl"(长度为5的字符串),单个字符转小写后和"charl"转小写比较,结果肯定都是False,所以最终得到空列表。
针对不同需求的解决方案
根据你的需求(匹配包含输入的单词,还是完全匹配单词),这里给出两种修改方案:
方案1:匹配包含输入子串的单词(比如输入"charl"匹配"Charles")
先把文本分割成单词,再遍历每个单词检查是否包含输入的子串(大小写不敏感):
x = self.lineEditSearch.text().lower() textString = self.ReadingFileContent(Item) # 将文本按空白字符分割成单词列表(如果需要处理标点,可以先清理文本) words = textString.split() # 筛选出包含输入子串的单词 self.varStr = [word for word in words if x in word.lower()] print(self.varStr)
方案2:完全匹配输入的单词(忽略大小写)
如果需要找和输入完全一致的单词(只是大小写不同),可以这样写:
x = self.lineEditSearch.text().lower() textString = self.ReadingFileContent(Item) words = textString.split() # 比较单词转小写后和输入转小写是否相等 self.varStr = [word for word in words if word.lower() == x] print(self.varStr)
额外情况:如果文本是按行读取的列表
如果你的ReadingFileContent返回的是每行文本组成的列表(而不是单个字符串),要找包含输入的行,可以这样修改:
x = self.lineEditSearch.text().lower() text_lines = self.ReadingFileContent(Item) self.varStr = [line for line in text_lines if x in line.lower()] print(self.varStr)
总结
你只需要把遍历的对象从单个字符改成单词/行,再做大小写不敏感的比较,就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者Propy Propy
相关产品推荐
相关产品推荐

