【问题标题】:Logic of string termination literal in python (namely the single and double quotes)python中字符串终止文字的逻辑(即单引号和双引号)
【发布时间】:2021-05-04 01:54:27
【问题描述】:

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

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

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


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

【问题讨论】:

    标签: python string quotes double-quotes


    【解决方案1】:

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

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

    实际的 FSM 将需要 3 个主要状态之外的其他状态,但它们是实现细节,在概念上并不重要。 FSM 可以通过复制单引号状态和转换并根据双引号进行适当的修改来轻松扩展以处理双引号。

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

    【讨论】:

      【解决方案2】:

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

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

      我不会做整个长的。但是每个'''''' 都是一个空的三引号字符串,所以它们的行是一样的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 2021-02-26
        • 2017-02-26
        相关资源
        最近更新 更多