python中字符串终止文本的逻辑(即单引号和双引号)



在python脚本或IDLE shell中,我们可以使用双引号"或单引号'或三个单引号或双引号的组合(主要用于文档字符串)'''打印文本。

我正在处理一些文本,并尝试了以下内容:''''4''''扫描文本时出现EOL。然后我这次尝试了使用5个引号,即'''''4''''',输出为"''4"

最后,我用大量的引号做了同样的尝试:
输入
>>> '''''''''''''''''''''''''''''ff'''''''''''''''''''''''''''
输出
"''ff"


我不明白为什么python在给定如此大量的'的情况下返回这样的输出。
问题:它是如何显示如此异常的输出的,它背后的逻辑是什么?

考虑一个简单的FSM(三种主要状态:代码中、字符串中和文档字符串中),它使用输入来处理单引号。当它在代码中并且在一行中遇到三个引号时,它将进入docstring状态。它一直处于docstring状态,直到遇到三个相同类型的引号。当它在代码中并且在一行中遇到少于三个引号时,它将进入字符串状态,并保持该状态,直到遇到(未跳过的)引号(可能会立即出现)。

当这个FSM处于代码状态并遇到一个长的引号序列(与RE/'{3,}/匹配)时,它进入和退出文档字符串状态(没有遇到非分隔符,所以字符串都是空的),直到最后几个引号字符,在这一点上,它要么仍在文档字符串状态中(所有剩余的引号都在字符串中),要么处于代码状态,并且任何剩余的引号被解释为字符串分隔符。如果它处于字符串或文档字符串状态,遇到一长串引号,它将首先转换到代码状态,然后每三个引号将在代码和文档字符串状态之间转换。结尾处的任何剩余引号都将按照前面所述进行解释。

实际的FSM将需要3个主要状态之外的其他状态,但它们是一个实现细节,在概念上并不重要。FSM也可以通过复制单引号状态&转换,并根据需要对双引号进行修改。

编写FSM的正式描述,并根据练习中留下的连续引号计数从初始状态计算最终状态(即编写函数end_state(initial_state, consecutive_quote_count))。

'''''4'''''被解析为

  • '''(开放字符串文字)
  • ''4(字符串内容)
  • '''(关闭字符串文字)
  • ''(空字符串文字)

我不会做整个长的。但每个''''''都是一个空的三引号字符串文字,所以它是沿着相同的行。

最新更新