Python - 文本处理状态机
状态机是关于设计一个程序来控制应用程序中的流程。 它是一个有向图,由一组节点和一组转移函数组成。 处理文本文件通常包括顺序读取文本文件的每个块,并响应每个块的读取而执行某些操作。 块的含义取决于在它之前出现的块类型以及在它之后出现的块类型。 这台机器是关于设计一个程序来控制应用程序中的流程。 它是一个有向图,由一组节点和一组转移函数组成。 处理文本文件通常包括顺序读取文本文件的每个块,并响应每个块读取做一些事情。 块的含义取决于在它之前出现的块类型以及在它之后出现的块类型。
考虑这样一种情况,其中放置的文本必须是 AGC(用于蛋白质分析)序列的连续重复字符串。如果在输入字符串中维护此特定序列,则机器的状态将保持为 TRUE,但一旦序列偏离,机器的状态将变为 FALSE,并在之后保持 FALSE。 这可确保停止进一步处理,即使稍后可能有更多正确序列块可用。
下面的程序定义了一个状态机,该状态机具有启动机器、获取输入以处理文本并逐步完成处理的功能。
class StateMachine: # Initialize def start(self): self.state = self.startState # Step through the input def step(self, inp): (s, o) = self.getNextValues(self.state, inp) self.state = s return o # Loop through the input def feeder(self, inputs): self.start() return [self.step(inp) for inp in inputs] # Determine the TRUE or FALSE state class TextSeq(StateMachine): startState = 0 def getNextValues(self, state, inp): if state == 0 and inp == 'A': return (1, True) elif state == 1 and inp == 'G': return (2, True) elif state == 2 and inp == 'C': return (0, True) else: return (3, False) InSeq = TextSeq() x = InSeq.feeder(['A','A','A']) print x y = InSeq.feeder(['A', 'G', 'C', 'A', 'C', 'A', 'G']) print y
当我们运行上面的程序时,得到以下输出 −
[True, False, False] [True, True, True, True, False, False, False]
在 x 的结果中,AGC 模式对于第一个"A"之后的第二个输入失败。在此之后,结果的状态永远保持为 False。 在 Y 的结果中,AGC 模式一直持续到第 4 个输入。 因此,结果的状态在此之前保持为 True。 但是从第 5 个输入开始,结果变为 False,因为 G 是预期的,但是 C 被发现了。