【发布时间】:2018-01-19 10:56:54
【问题描述】:
我正在编写一个程序,它使用 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)
【问题讨论】:
-
comparison仅在boyer_moore中定义,因此是该函数的本地函数,但您尝试在其他地方调用它