Python – 文本处理状态机
状态机是关于设计控制应用程序中流程的程序。它是一个有向图,由一组节点和一组转换函数组成。处理文本文件往往包括顺序读取每个文本块并对每个块读取做出相应处理。块的含义取决于先前存在的块类型和后续块的类型。该机器是关于设计控制应用程序中流程的程序。它是一个有向图,由一组节点和一组转换函数组成。处理文本文件往往包括顺序读取每个文本块并对每个块读取做出相应处理。块的含义取决于先前存在的块类型和后续块的类型。
考虑这样一种情况,文本输入必须是AGC循环序列的连续字符串(用于蛋白质分析)。如果输入字符串中保持了这种特定序列,则机器的状态保持为TRUE,但是一旦序列偏离,机器的状态将成为FALSE,并且之后将保持FALSE。这确保了即使可能存在更多的正确序列块,进一步的处理也会停止。
以下程序定义了一个状态机,该状态机具有开始机器、输入处理文本和通过处理进行步进的函数。
class StateMachine:
# 初始化
def start(self):
self.state = self.startState
# 通过输入进行步进
def step(self, inp):
(s, o) = self.getNextValues(self.state, inp)
self.state = s
return o
# 循环输入
def feeder(self, inputs):
self.start()
return [self.step(inp) for inp in inputs]
# 确定TRUE或FALSE状态
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的结果中,第二个输入在第一个“A”后AGC的模式失败。结果的状态在此之后一直为False。在y的结果中,AGC的模式一直持续到第四个输入。因此结果的状态在那一点之前一直为True。但是从第五个输入开始,结果变为False,因为期望的是G,但找到的是C。