我正在编写一个程序,使用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)
答案 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))
希望它现在可以帮助你。