文字列の前後の引用符が一致しない場合、Python はなぜエラーを返さないのでしょうか?

okwaves2024-01-25  8

私は最近 Python を学び始めましたが、なぜ Python が次のように動作するのか理解できません。


>>> "OK"
'OK'
>>> """OK"""
'OK'
>>> "not Ok'
  File "<stdin>", line 1
    "not Ok'
           ^
SyntaxError: EOL while scanning string literal
>>> "not OK"""
'not OK'

引用符の数が一致しないため、最後のステートメントでエラーが発生しないのはなぜですか?

8

正式なドキュメントをご希望の場合は、ここにあります。

– カール・クネヒテル

2020 年 9 月 4 日 2:21

2

もう少し洞察を提供したいと思います。あなたを混乱させたのは、「」「OK」「」を解釈したことだと思います。 「引用内の引用内の引用」であること。 "("("OK")")" しかし、それはそうではありません。三重引用符 (""" または ''') は 3 文字で構成されていますが、複数行の逐語的文字列を開始 (および終了) する単一の記号として扱われます。 (これを参照)。実際には引用符をネストすることはできません。 「foo 'bar」のようなものまたは 'foo "bar"' の場合、内側の引用符は通常の文字として扱われるため、これも機能します。バー」。

– フィリップ・ミロバノヴィć

2020 年 9 月 6 日 9:14



------------------------

最後の「」」は三重引用符として認識されず、単一の " として認識されます。 (現在の文字列リテラルを閉じるため) 空の文字列 "" が続きます。 2 つの並置された文字列リテラルが連結されます。同じ動作は、「終わり」と「始まり」の間にスペースを入れると、より簡単に認識できます。

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

4

16

さらに詳しく説明するには: >>>「ok」'' >>>「わかりました」「」

– デュークシルバー

2020 年 9 月 4 日 22:29

9

余談: @DukeSilver>>> を入れることは考えないでください。コード スニペットの前にある は、質問と回答の場合と同様にコメントでも機能します。人によっては、あなたが使っている奇妙なエイリアンのオペレーターのように見えるかもしれません。完全に判読可能です。

– ポールエヴァンス

2020 年 9 月 5 日 15:37

@PaulEvans これは、Python コンソールが入力した各行の前に置くマーカーです。

– nick012000

2020 年 9 月 6 日 14:58

8

@nick012000 わかります。それが質問と回答でうまく機能する理由です。私が言いたいのは、それは不必要だということですd コメント内で混乱を招く可能性があります。

– ポール・エヴァンス

2020 年 9 月 6 日 15:51



------------------------

「OKではありません」「」

Python はこれを「not OK」+「」として解釈します。

「not Ok」「ay」を指定すると、「not OK」という出力が表示されます。

2020 年 9 月 3 日 15:55 に回答

サンドリン ジョイ

サンドリン ジョイ

1,137

11 個

銀バッジ 11 個

29

銅バッジ 29 個

3

1

"""""""""わかりました「」ファイル ""、行 1 """"""""""わかりました「」 ^ SyntaxError: 無効な構文です。 「」「わかりました」はどうでしょうか? ?それは私に何か奇妙なものを与えます

– イブラ

2020 年 9 月 3 日 16:06

3

「」「わかりました」 , したがって、Python では、 """ となります。三重引用符は、必要に応じて複数行の文字列を作成するために使用されます。したがって、Python は三重引用符を見つけると、その開始三重引用符の終了三重引用符を探します。

– サンドリン・ジョイ

2020 年 9 月 3 日 16:14

9

Python がスキャンするとき開始引用符では、通常の引用符よりも三重引用符が優先されます。ただし、開始相場が決まると、終了相場も決まります。したがって、文字列が単純な二重引用符で始まっている場合、もう一方の端では二重引用符が 1 つだけ使用され、それ以降はすべて次のトークンの一部になります。

– カール・クネヒテル

2020 年 9 月 4 日 2:20



------------------------

「」と「」の間に違いはないと思われるかもしれません。または ' ですが、実際には、Python は貪欲なメソッドを使用して入力を受け入れます。

Python が一致する引用符を見つけると、ステートメントは終了します。

これが、「's」のようなものを書くことができる理由です。 「」;。文字列内には ' がありますが、文字列内にあるため、Python はエラーを発生させません。その後、「」があります。続いて「」しかし、それは別の (空の) 文字列です。

「s」のようなことを行うと、Python は次の「s」を探します。 if がコマンドを実行する前に。

5

5

このメソッドを「貪欲」と呼ぶのはなぜですか?

– ステフ

2020 年 9 月 4 日 10:24

3

これは、後のオプションの方が良い場合でも、「最初に適合するもの」を採用するアルゴリズムのクラスの一般的な説明であるためです。

– Ingix

2020 年 9 月 4 日 20:39

10

それは「貪欲」ということではありません。手段。貪欲とは、文字列に一致させるために A.*B のような正規表現を作成したものの、正規表現が「貪欲」であるため、AB だけではなく ABBB のようなものと一致してしまうことを意味します。t;.

– ユーザー

2020 年 9 月 5 日 3:35

4

上記の 2 番目の Pat-Laugh: これは実際には貪欲とは正反対です。これは遅延アルゴリズムです。

– ウィル

2020 年 9 月 5 日 4:00

ただし、完全に怠惰というわけではありません。 「」見積もりを開始する貪欲だ。 (ただし、ほとんどのことは怠惰です。)

– wizzwizz4

2020 年 9 月 6 日、11:20



------------------------

Python はスタック実装と同様に使用して、引用符の開始と終了を検出します。 スタックが何であるかを知っている場合は、それはデータ構造であり、最後の要素が最初に削除されます。

文字列が A = "''" であると仮定します。 これが行うことは、最初に一重引用符または二重引用符が出現するたびにそれをスタックに追加し、もちろん "" でない限り、1 秒ごとにスタックから削除します。これは単一のものとして解析されます

この例では、モミに対して A = "''" を反復処理します。最初の 2 つの要素はスタックに追加され、次の 2 つの要素は削除されます。

したがって、最終的にスタック内の要素の数がゼロでなければならない場合に限り、引用符は一致します。

1

3

文字列が "'" だった場合、それはないだろう'すべての文字列を解析してもスタックが空ではないため許可されませんか??これは正しくありません。

– アソシア

2020 年 9 月 10 日 8:58

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。