为啥python说一个字符串与另一个字符串不匹配[重复]

Posted

技术标签:

【中文标题】为啥python说一个字符串与另一个字符串不匹配[重复]【英文标题】:Why is python saying that a string doesn't match the other when it does [duplicate]为什么python说一个字符串与另一个字符串不匹配[重复] 【发布时间】:2020-03-21 01:44:16 【问题描述】:

所以我有一个名为 words.txt 的文本文件,它包含 3 个单词:

apple
ship
door

而我要做的是让用户输入一个单词,然后搜索文件以查看是否有这样的单词,如果没有则添加:

def search(word):
    file = open("words.txt", "r+")

    for line in file:
        if line == word:
            return False

    file.write(word + "\n")
    return True

然后我使用该函数检查并打印结果,但问题是当我输入单词 ship 或列表中的任何其他单词时,它应该说它不存在是的。

【问题讨论】:

正如其中一个答案所说,您未能定义预期的返回值是什么。如所写,在匹配的情况下返回 False,在不匹配的情况下返回 True(但文件已更新)。这似乎不是您所期望的。首先编写一个描述结果的文档字符串,然后您可以检查代码是否实现了这些结果(最好通过编写测试用例:)) 这可能是错误的两种方式:1)它无法返回False,因为您正在比较"ship""ship\n",而不是"ship""ship",或者2 ) 当"ship""ship" 进行比较时,它无法返回True。需要明确的是,绝对您不承认line 将以换行符结尾是一个问题,但您也可能交换了返回值。 【参考方案1】:

你可能需要做 line=line[0:-1] 您拥有的 line 变量也有尾随的换行符 '\n'。

【讨论】:

解决这个问题的方法是使用line.strip(),而不是扔掉最后一个字符。 @JanChristophTerasa line.strip() 会丢弃所有尾随前导空格。 line.rstrip('\n') 将是删除 just 单个换行符的更惯用方式。由于根据定义,最后一个字符是换行符,因此切片仍然有效。 确实如此,但在给出的示例代码中应该是等价的。 您的建议充其量相当于这个答案。一般来说,客观上是更糟 我明白你的意思。但我仍然认为使用索引删除空格是不好的做法,并且一般而言这比使用striprstrip 更糟糕,因为您必须在代码中添加条件.对于这个问题,这无关紧要(因为使用striprstrip('\n') 无关紧要)。【参考方案2】:

迭代文本文件时,行终止符\n 保留在循环索引中。您需要在比较之前将其删除:

def search(word):
    file = open("words.txt", "r+")

    for line in file:
        if line.rstrip('\n') == word:
            return False

    file.write(word + "\n")
    return True

如果文件中的任何前导和尾随空格不重要,您可以将line.rstrip('\n') 简化为line.strip()

>>> " foo \n".rstrip('\n')
" foo "
>>> " foo \n".strip()
"foo"

【讨论】:

line.rstrip('\n') 显然是唯一正确的答案,as we have discussed。包括strip() 解决方案似乎毫无意义。

以上是关于为啥python说一个字符串与另一个字符串不匹配[重复]的主要内容,如果未能解决你的问题,请参考以下文章

当字符串周围的引号不匹配时,为啥 Python 不给出任何错误?

用python中re.match匹配为啥一直是None?

为啥 re.sub() 在 Python 中默认添加不匹配的字符串?

Bash - 获取命令(字符串)的值并查看它是不是与另一个字符串匹配

为啥python脚本中使用中文会报错? 解决方法已知.. 只想知道详细的原因

(访问)在文本字段中搜索与另一个表字段中的字符串匹配的字符串,并在子表单中显示这些匹配记录