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模式一直持续到第四个输入。因此,结果的状态在那一点上保持为True。但是从第五个输入开始,结果变为False,因为预期的是G,但发现了C。