NameError: name is not defined, even when I define the name

NameError: name is not defined, even when I define the name

我正在编写一个程序,使用 BoyerMoore 算法解析与文本匹配的文本模式。我设法得到了找到所有匹配项的代码,并打印出匹配项的位置。

现在我也尝试获取match_table的长度和比较的次数。我对 python 很陌生,程序告诉我“NameError:名称 'comparison' 未定义,即使它在 def boyer_moore 中使用。 该程序显然不保存变量供以后使用。如果这听起来令人困惑,我很抱歉,我是 python 的新手。匹配的文本可以是 found here

def make_bad_match_table(pattern):

length = len(pattern)
table = {}
for i, c in enumerate(pattern):
    if i == length-1 and not c in table:
        table[c] = length
    else:
        table[c] = length - i - 1

return table




def boyer_moore(pattern, text):
    comparison = 0
    match_table = []
    pattern_length = len(pattern)
    text_length = len(text)
    if pattern_length > text_length:
        return match_table

    table = make_bad_match_table(pattern)
    index = pattern_length - 1
    pattern_index = pattern_length - 1

    while index < text_length:
        if pattern[pattern_index] == text[index]:
            if pattern_index == 0:
                match_table.append(index)
                pattern_index = pattern_length - 1
                index += (pattern_length * 2 - 1)
                comparison +=1
            else:
                pattern_index -= 1
                index -= 1
        else:
            index += table.get(text[index], pattern_length)
            pattern_index = pattern_length - 1

    return match_table
    return comparison

if __name__ == '__main__':

    file = open("CNN.txt", "r")
    target = file.read()
    pattern = "NASA"
    print(pattern,boyer_moore(pattern, target))
    print(len(match_table))
    print(comparison)

您也不能在 return 语句之后添加语句,因此您必须删除 boyer_moore 函数末尾的 return 之一。

return match_table
return comparison

1.Firstly 而不是

return match_table
return comparison

就这样

return (match_table, comparison)

2.Instead 的:

print(pattern,boyer_moore(pattern, target))
print(len(match_table))
print(comparison)

就这样:

 match_table, comparsion = boyer_moore(pattern, target)
 print(pattern)
 print(comparison, len(match_table))

希望现在对您有所帮助。