Python Text Processing 简明教程

Python - Text Processing State Machine

状态机是关于设计一个程序来控制应用程序中的流程。它是一个有向图,由一组节点和一组转换函数组成。处理文本文件通常包括顺序读取文本文件的每个块,并针对每个读取的块执行某些操作。块的含义取决于在块之前存在哪些类型的块以及在块之后出现哪些块。该机器是关于设计一个程序来控制应用程序中的流程。它是一个有向图,由一组节点和一组转换函数组成。处理文本文件通常包括顺序读取文本文件的每个块,并针对每个读取的块执行某些操作。块的含义取决于在块之前存在哪些类型的块以及在块之后出现哪些块。

考虑一种场景,其中文本 put 必须是 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 的结果中,在第一个“A”之后,AGC 的模式对于第二个输入失败。此后,结果的状态将永久保持 False。在 Y 的结果中,AGC 的模式持续到第 4 个输入。因此,结果的状态至此保持 True。但是,从第 5 个输入开始,结果变为 False,因为期望得到 G,但找到了 C。