当字符串周围的引号不匹配时,为啥 Python 不给出任何错误?

Posted

技术标签:

【中文标题】当字符串周围的引号不匹配时,为啥 Python 不给出任何错误?【英文标题】:Why doesn't Python give any error when quotes around a string do not match?当字符串周围的引号不匹配时,为什么 Python 不给出任何错误? 【发布时间】:2020-12-22 21:46:27 【问题描述】:

我最近开始学习 Python,我不明白为什么 Python 会这样:

>>> “好的” '好的' >>> """好的""" '好的' >>>“不好” 文件“”,第 1 行 “不好' ^ SyntaxError:扫描字符串文字时 EOL >>>“不行”“” '不好'

由于引号的数量不匹配,为什么最后一条语句不出错?

【问题讨论】:

如果您更喜欢正式的文档,它是here。 只是为了提供更多见解:我认为让您感到困惑的是,您将 """OK""" 解释为“引用中的引用”"("("OK")")",但事实并非如此。三引号("""''')虽然由三个字符组成,但被视为开始(和结束)多行逐字字符串的单个符号(请参阅this)。你不能真正嵌套引号;在"foo 'bar'"'foo "bar"' 之类的内容中,内部引号被视为普通字符,因此"foo ' bar" 也可以使用。 【参考方案1】:

Python 使用类似于堆栈的实现来检测引号的打开和关闭。 如果您知道堆栈是什么,它是一个数据结构,其中 Last 元素将首先被删除。

假设你的字符串是A = "''" 它的作用是,对于第一次遇到的每个单引号或双引号,它会将其添加到堆栈中,并且每隔一秒,它将从堆栈中删除,除非它的当然 """ 将被解析为单个

在我们的示例中,A = "''" 对其进行迭代,前 2 个元素将被添加到堆栈中,而接下来的 2 个元素将被删除。

所以引号将被匹配,当且仅当栈中元素的数量最后必须为零

【讨论】:

所以如果字符串是"'" 它不会允许它,因为在解析所有字符串后堆栈不是空的??这是不正确的。【参考方案2】:

最后的""" 不被识别为三引号,而是单个"(用于关闭当前字符串文字)后跟一个空字符串"";两个并列的字符串文字被连接起来。通过在关闭和打开" 之间放置一个空格,可以更容易地识别相同的行为。

>>> "not OK" ""
'not OK'

【讨论】:

为了进一步推动这个家:>>>"ok"''>>>'ok'"" 旁白:@DukeSilver 不要认为将>>> 放在代码前 sn-ps 在 cmets 中的效果与在问题和答案中一样好。对某些人来说,它可能看起来像是您正在使用的奇怪的外星运算符,而 "ok"'' 却非常清晰。 @PaulEvans 这是 Python 控制台在您输入的每一行前面放置的标记。 @nick012000 我知道,这就是它在问答中运行良好的原因。我的观点是,它在 cmets 中是不必要的并且可能会造成混淆。【参考方案3】:

你会认为 " 或 ' 之间没有区别,但实际上,Python 使用一种贪婪的方法来接受输入。

一旦 Python 看到匹配的引号,则结束语句。

这就是为什么你可以写像"'s" "" 这样的东西。在字符串内部有一个 ' 但因为你在一个字符串中,python 不会引发错误。然后在那之后,有一个 " 后跟 " 但这是一个不同的(空)字符串。

如果您执行 "s' 之类的操作,那么 Python 会在 if 运行您的命令之前寻找下一个 "

【讨论】:

为什么称这种方法为“贪婪”? 因为这是对一类算法的一般描述,它采用“第一个适合的东西”,即使以后的选择会更好。 这不是“贪婪”的意思。贪婪意味着当你创建一个像A.*B 这样的正则表达式来匹配一个字符串时,它最终会匹配像ABBB 这样的东西,而不仅仅是AB,因为正则表达式是“贪婪的”。 第二次 Pat-Laugh 上面:这实际上与 greedy 完全相反:这是一个 lazy 算法。 不过,它并不完全是懒惰的; """ 开始引号是贪婪的。 (不过,大多数事情都是懒惰的。)【参考方案4】:

"not OK"""

Python 将其解释为 "not OK"+""

如果你给"not Ok""ay",你会得到'not Okay'的输出

【讨论】:

"""""""" ok "" 文件 "",第 1 行 """""""" ok "" ^ SyntaxError: 无效语法。 “”“好”呢?它给了我一些奇怪的东西 """ok" ,所以在python中,如果需要的话,"""三引号用于创建多行字符串。所以当python找到一个三引号时,它会查找结尾的三引号开头的三引号。 当 Python 扫描开头引号时,它更喜欢三引号而不是普通引号。但是一旦开盘价确定,收盘价也随之确定;因此,如果字符串以普通双引号开头,则另一端只使用一个双引号,之后的任何内容都是下一个标记的一部分。

以上是关于当字符串周围的引号不匹配时,为啥 Python 不给出任何错误?的主要内容,如果未能解决你的问题,请参考以下文章

Python:在字符串周围插入双引号或单引号

在字符串周围用引号编写csv(Python)

grep与python匹配html文件中引号内的字符串[关闭]

在python中的字符串周围强制使用三引号[关闭]

为啥 re.sub() 在 Python 中默认添加不匹配的字符串?

php中单引号和双引号的区别,哪个速度更快?为啥?