当字符串周围的引号不匹配时,为啥 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 会这样:
>>> “好的” '好的' >>> """好的""" '好的' >>>“不好” 文件“由于引号的数量不匹配,为什么最后一条语句不出错?
【问题讨论】:
如果您更喜欢正式的文档,它是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 "" 文件 "以上是关于当字符串周围的引号不匹配时,为啥 Python 不给出任何错误?的主要内容,如果未能解决你的问题,请参考以下文章
grep与python匹配html文件中引号内的字符串[关闭]