AC算法即Aho-Corasick自动机算法的简称
使用AC算法匹配"中国小说网是一个各种小说都有的小说网站,小说网有个类小说作家"中的"中国小说网"、"小说网有"、"小说网站"、"各种小说"、"网站"
定义2个类 Tree,和 Node 类
Tree类设置个私有属性名为 __root的Node实例(树的根节点)
构造函数里实例化一个根节点赋值给__root
AddPattenrns 方法为AC自动机(或者叫树)对象添加需要匹配的模式串
Matching 方法去匹配目标字符串
#! python3
from node import Node
class Tree():
def __init__(self):
self.__root = Node()
def AddPatterns(self, *Patterns):
for pattern in Patterns:
currentNode = self.__root
for character in pattern:
currentNode = currentNode.AddGotoNode(character)
currentNode.AddOutput(pattern)
self.__root.AddFailNode(self.__root)
self.__root.ConstructionFail(self.__root)
pass
def Matching(self, text):
currentNode = self.__root
for character in text:
currentNode = currentNode.NextNode(character)
Node类设置名__goto私有属性(一个指向模式串下个字符的节点集合)
设置一个名为__fail私有属性(指向匹配失败指向的节点)
设置一个名为__output私有属性(节点返回匹配成功的模式串)
设置一个名为__isbole私有属性(是否第一节点,因为第一节点的__fail节点必须指向Tree的__root节点)
设置一个名为__character私有属性(当前节点的字符)
AddGotoNode 方法添加当前节点下个匹配成功的节点及__goto集合添加节点
ConstructionFail 方法构造当前节点下__goto集合中各个节点的__fail属性指向的节点
AddFailNode 方法为当前节点添加__fail属性指向的节点
AddOutput 方法为__output属性赋值
NextNode 方法获取下个字符串对应树种的节点
PrintResult 方法打印匹配到的模式串
#! python3
class Node():
def __init__(self, IsBole=True, Character=None):
self.__goto = {}
self.__fail