Python:比较两个应该相同但不相同的字符串

问题描述 投票:2回答:5

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

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(ofc它们不一样,所以如果我使用'is'而不是'=='它将无效)。另外我确定句子在我的文本文件中,它甚至存储在raw_data [210]中。我检查了“类型”,它是str。句子中也有大约3个空格,我不知道这是否有帮助,而“len(raw_dadat)”或多或少等于4000.好吧,我看不出我做错了什么。非常感谢提前!!

python string
5个回答
4
投票

额外的间距可能是你的罪魁祸首。您也可以尝试下拉字符串。

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()切断任何前面或尾随的空格


正如@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]

1
投票

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

null_term_str_compare = "123456789012345\0"

0
投票

也许您可以在文件中以字符串形式获取文本行,然后得到:

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

然后将其转换为if语句

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

0
投票

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

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)

0
投票

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

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

它奏效了!非常感谢大家!(还有额外的建议)。

© www.soinside.com 2019 - 2024. All rights reserved.