【问题标题】:Python: Comparing two strings that should be the same but that are notPython:比较两个应该相同但不同的字符串
【发布时间】:2013-08-01 16:13:54
【问题描述】:

我是菜鸟,所以我希望这是提出这个问题的正确地方。这真的让我发疯。我在某个文本文件中寻找一个句子,这里是部分代码:

SentenceIMLookingfor='blha blha blah'
with open('textfile.lua','r') as my_file:
    raw_dadat=my_file.read().split('\n')
    for i in range(1, len(raw_dadat)):
        if(raw_dadat[i]==SentenceIMLookingfor):
          DO_SOMETHING

好吧,它什么也没做。(我需要知道“SentenceIMLookingfor”在哪一行)。 我已经检查了 ids(他们不一样,所以如果我使用 'is' 而不是 '==' 它将不起作用)。另外我确定这句话在我的文本文件中,它甚至存储在 raw_data[210] 中。我检查了“类型”,它是 str。句子中还有大约3个空格,我不知道这是否有帮助,“len(raw_dadat)”或多或少等于4000。 好吧,我不明白我做错了什么。 提前非常感谢!

【问题讨论】:

  • 您是否尝试打印出 raw_datat[i] 是什么来尝试调试它?
  • 可能有一些标点符号、尾随或前导空格或其他无法导致完全匹配的东西。我会遍历字符串并添加一些分隔符来检查这一点。

标签: python string


【解决方案1】:

额外的间距很可能是你的罪魁祸首。您也可以尝试将字符串小写。

SentenceIMLookingfor='blha blha blah'
with open('textfile.lua','r') as my_file:
    for line in my_file:
        if line.lower().strip() == SentenceIMLookingfor:
            #DO_SOMETHING

但是,如果您没有检查 完全 等于您要查找的句子的行,则需要使用 in 运算符来检查是否相等,所以用

替换上面的if
        if SentenceIMLookingfor in line.lower(): # you may not want .lower()

由于不需要将整个文件读入内存,您可以使用for line in my_file 遍历文件的行。 .lower() 将字符串转换为所有小写字母,.strip() 切断任何前面或后面的空格


按照 cmets 中 @SethMMorton 的建议,您可以使用 enumerate 迭代行号 for i, line in enumerate(my_file)

如果您尝试收集此字符串出现的行号(这似乎很可能),您可以通过列表理解来完成此操作

with open('textfile.lua','r') as my_file:
    line_nos = [i for i, line in enumerate(my_file) if line.lower().strip() == SentenceIMLookingfor]

【讨论】:

  • 既然 OP 需要知道它所在的线路,也许for i, line in enumerate(my_file): 会更好?
【解决方案2】:

另外,请注意,如果您要与一个以空字符结尾的字符串进行比较,它们在打印时可能看起来是相同的值,但一个可能是空字符结尾而另一个不是。因此,如果您看到两个看似相同但实际上不同的字符串,请确保您已放入空终止符。

null_term_str_compare = "123456789012345\0"

【讨论】:

    【解决方案3】:

    也许你可以在文件中获取一行文本作为字符串,然后得到这个:

    >>> a = "qwertyuiopasdfghjkl"
    >>> "qwerty" in a
    True
    >>>
    

    然后把它变成一个if语句

    mySentence = "hello"
    for line in file:
        if mySentence in line:
            # Do something
    

    【讨论】:

      【解决方案4】:

      您提供的代码对我有用。您确定要在目标文件中包含要查找的字符串吗?

      Python 也从 0 开始计数。您的意思是从 1 开始您的范围吗?如果您的搜索词是文件中的第一行,您将无法使用您的代码找到它。

      以下是您的代码的一个稍微干净的版本(请注意,我不是迭代一个范围,而是简单地迭代文件中的行)。我已经对此进行了测试,它也可以工作。

      SentenceIMLookingfor='blha blha blah'
      with open('textfile.lua','r') as my_file:
          raw_dadat=my_file.read().split('\n')
          for line in raw_dadat:
              if SentenceIMLookingfor in line:
                  print "Found"
                  print "Line: {0}".format(line)
      

      【讨论】:

        【解决方案5】:

        问题确实是间距。为了让它工作,我稍微改变了我的条件,如果这样:

        if(raw_dadat[i].strip()==SentenceIMLookingfor.strip()):
        

        它奏效了!非常感谢你们所有人!(还有额外的建议)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-19
          • 1970-01-01
          • 2020-08-16
          相关资源
          最近更新 更多