NameError:即使我定义名称

时间:2018-01-19 10:56:55

标签: python algorithm defined

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

现在我也尝试获取match_table的长度和比较次数。我对python非常不熟悉,程序告诉我" NameError:name' 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)

2 个答案:

答案 0 :(得分:0)

你也不能在return语句之后有一个语句,所以你必须删除boyer_moore函数末尾的一个返回。

return match_table
return comparison

答案 1 :(得分:0)

1.首先代替

return match_table
return comparison

只是做

return (match_table, comparison)

2.而不是这个:

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))

希望它现在可以帮助你。