23.2. shlex —単純な字句解析—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/shlex
移動先:案内検索

23.2。 shlex —単純な字句解析

バージョン1.5.2の新機能。


ソースコード: :source: `Lib / shlex.py`



shlex クラスを使用すると、Unixシェルに似た単純な構文の字句アナライザーを簡単に作成できます。 これは、ミニ言語の記述(Pythonアプリケーションの実行制御ファイルなど)や引用符で囲まれた文字列の解析に役立つことがよくあります。

Python 2.7.3より前は、このモジュールはUnicode入力をサポートしていませんでした。

shlex モジュールは、次の関数を定義します。

shlex.split(s[, comments[, posix]])

シェルのような構文を使用して、文字列 s を分割します。 commentsFalse (デフォルト)の場合、指定された文字列内のコメントの解析は無効になります( shlex [の commenters 属性を設定します) X174X]インスタンスを空の文字列に)。 この関数はデフォルトでPOSIXモードで動作しますが、 posix 引数がfalseの場合は非POSIXモードを使用します。

バージョン2.3の新機能。

バージョン2.6で変更: posix パラメーターが追加されました。

ノート

split()関数は shlex インスタンスをインスタンス化するため、 sNoneを渡すと、文字列が読み取られ、標準入力から分割されます。

shlex モジュールは、次のクラスを定義します。

class shlex.shlex([instream[, infile[, posix]]])
shlex インスタンスまたはサブクラスインスタンスは、字句解析オブジェクトです。 初期化引数が存在する場合は、どこから文字を読み取るかを指定します。 これは、 read()および readline()メソッドを持つファイル/ストリームのようなオブジェクト、または文字列である必要があります(文字列はPython 2.3以降で受け入れられます)。 引数が指定されていない場合、入力はsys.stdinから取得されます。 2番目のオプションの引数は、 infile 属性の初期値を設定するファイル名文字列です。 instream 引数が省略されているかsys.stdinと等しい場合、この2番目の引数はデフォルトで「stdin」になります。 posix 引数はPython2.3で導入され、動作モードを定義します。 posix がtrueでない場合(デフォルト)、 shlex インスタンスは互換モードで動作します。 POSIXモードで動作している場合、 shlex はPOSIXシェル解析ルールに可能な限り近づけようとします。

も参照してください

モジュール ConfigParser
Windows .iniファイルと同様の構成ファイルのパーサー。


23.2.1。 shlexオブジェクト

shlex インスタンスには次のメソッドがあります。

shlex.get_token()
トークンを返します。 push_token()を使用してトークンがスタックされている場合は、スタックからトークンをポップします。 それ以外の場合は、入力ストリームから1つを読み取ります。 読み取りでファイルの即時終了が発生した場合、 eof が返されます(非POSIXモードでは空の文字列()、POSIXモードではNone)。
shlex.push_token(str)
引数をトークンスタックにプッシュします。
shlex.read_token()
生のトークンを読み取ります。 プッシュバックスタックを無視し、ソースリクエストを解釈しません。 (これは通常、有用なエントリポイントではなく、完全を期すためにのみここに記載されています。)
shlex.sourcehook(filename)

shlex がソースリクエストを検出すると(以下の source を参照)、このメソッドには引数として次のトークンが与えられ、ファイル名と開いているファイルのようなオブジェクトで構成されるタプルを返すことが期待されます。

通常、このメソッドは最初に引数から引用符を取り除きます。 結果が絶対パス名である場合、以前のソースリクエストが有効になっていない場合、または以前のソースがストリーム(sys.stdinなど)であった場合、結果はそのままになります。 それ以外の場合、結果が相対パス名の場合、ソースインクルージョンスタック上のファイルの直前のファイル名のディレクトリ部分が先頭に追加されます(この動作は、Cプリプロセッサが#include "file.h"を処理する方法と似ています)。

操作の結果はファイル名として扱われ、タプルの最初のコンポーネントとして返され、 open()が呼び出されて2番目のコンポーネントが生成されます。 (注:これは、インスタンスの初期化における引数の順序の逆です!)

このフックは公開されているため、ディレクトリ検索パス、ファイル拡張子の追加、およびその他の名前空間ハックを実装するために使用できます。 対応する「close」フックはありませんが、shlexインスタンスは、EOFを返すときに、ソース入力ストリームの close()メソッドを呼び出します。

ソーススタッキングをより明示的に制御するには、 push_source()および pop_source()メソッドを使用します。

shlex.push_source(stream[, filename])

入力ソースストリームを入力スタックにプッシュします。 filename引数を指定すると、後でエラーメッセージで使用できるようになります。 これは、 sourcehook()メソッドによって内部的に使用されるのと同じメソッドです。

バージョン2.1の新機能。

shlex.pop_source()

最後にプッシュされた入力ソースを入力スタックからポップします。 これは、レクサーがスタックされた入力ストリームでEOFに到達したときに内部的に使用されるのと同じ方法です。

バージョン2.1の新機能。

shlex.error_leader([file[, line]])

このメソッドは、UnixCコンパイラエラーラベルの形式でエラーメッセージリーダーを生成します。 形式は'"%s", line %d: 'で、%sは現在のソースファイルの名前に置き換えられ、%dは現在の入力行番号に置き換えられます(オプションの引数を使用して、これらをオーバーライドします)。

この便利さは、 shlex ユーザーが、Emacsや他のUnixツールで理解できる標準の解析可能な形式でエラーメッセージを生成するように促すために提供されています。

shlex サブクラスのインスタンスには、字句解析を制御するか、デバッグに使用できるパブリックインスタンス変数がいくつかあります。

shlex.commenters
コメント初心者として認識される文字列。 コメントの開始から行末までのすべての文字は無視されます。 デフォルトでは'#'のみが含まれます。
shlex.wordchars
複数文字のトークンに蓄積される文字列。 デフォルトでは、すべてのASCII英数字とアンダースコアが含まれます。
shlex.whitespace
空白と見なされてスキップされる文字。 空白はトークンを制限します。 デフォルトでは、スペース、タブ、改行、およびキャリッジリターンが含まれます。
shlex.escape

エスケープと見なされる文字。 これはPOSIXモードでのみ使用され、デフォルトでは'\'のみが含まれます。

バージョン2.3の新機能。

shlex.quotes
文字列引用符と見なされる文字。 トークンは、同じ引用符が再び検出されるまで蓄積されます(したがって、シェルの場合と同様に、異なる引用符タイプが相互に保護します)。デフォルトでは、ASCIIの一重引用符と二重引用符が含まれます。
shlex.escapedquotes

エスケープで定義されたエスケープ文字を解釈する引用符内の文字。 これはPOSIXモードでのみ使用され、デフォルトでは'"'のみが含まれます。

バージョン2.3の新機能。

shlex.whitespace_split

Trueの場合、トークンは空白でのみ分割されます。 これは、たとえば、 shlex を使用してコマンドラインを解析し、シェル引数と同様の方法でトークンを取得する場合に役立ちます。

バージョン2.3の新機能。

shlex.infile
クラスのインスタンス化時に最初に設定された、または後のソース要求によってスタックされた、現在の入力ファイルの名前。 エラーメッセージを作成するときに、これを調べると役立つ場合があります。
shlex.instream
この shlex インスタンスが文字を読み取る入力ストリーム。
shlex.source
この属性は、デフォルトではNoneです。 文字列を割り当てると、その文字列は、さまざまなシェルのsourceキーワードと同様の字句レベルの包含要求として認識されます。 つまり、直後のトークンがファイル名として開かれ、EOFまでそのストリームから入力が取得されます。EOFの時点で、そのストリームの close()メソッドが呼び出され、入力ソースが再び呼び出されます。元の入力ストリームになります。 ソースリクエストは、任意の数のレベルの深さまでスタックできます。
shlex.debug
この属性が数値で1以上の場合、 shlex インスタンスはその動作に関する詳細な進行状況出力を出力します。 これを使用する必要がある場合は、モジュールのソースコードを読んで詳細を学ぶことができます。
shlex.lineno
ソース行番号(これまでに見られた改行の数に1を加えたもの)。
shlex.token
トークンバッファ。 例外をキャッチするときにこれを調べると役立つ場合があります。
shlex.eof

ファイルの終わりを決定するために使用されるトークン。 これは、非POSIXモードでは空の文字列()に設定され、POSIXモードではNoneに設定されます。

バージョン2.3の新機能。


23.2.2。 ルールの解析

非POSIXモードで動作している場合、 shlex は次のルールに従おうとします。

  • 引用符は単語内で認識されません(Do"Not"Separateは単一の単語Do"Not"Separateとして解析されます)。
  • エスケープ文字は認識されません。
  • 文字を引用符で囲むと、引用符内のすべての文字のリテラル値が保持されます。
  • 閉じ引用符は別々の単語を引用します("Do"Separate"Do"およびSeparateとして解析されます)。
  • whitespace_splitFalseの場合、単語文字、空白、または引用符として宣言されていない文字は、1文字のトークンとして返されます。 Trueの場合、 shlex は空白の単語のみを分割します。
  • EOFは、空の文字列()で通知されます。
  • 引用符で囲まれていても、空の文字列を解析することはできません。

POSIXモードで動作している場合、 shlex は次の解析ルールに従おうとします。

  • 引用符は削除され、単語は区切られません("Do"Not"Separate"は単一の単語DoNotSeparateとして解析されます)。
  • 引用符で囲まれていないエスケープ文字(例: '\')次の文字のリテラル値を保持します。
  • エスケープされた引用符の一部ではない引用符で文字を囲む(例: "'")引用符内のすべての文字のリテラル値を保持します。
  • エスケープされた引用符の一部である引用符で文字を囲む(例: '"')は、 escape で言及されている文字を除いて、引用符内のすべての文字のリテラル値を保持します。 エスケープ文字は、使用中の引用符またはエスケープ文字自体が後に続く場合にのみ、その特別な意味を保持します。 それ以外の場合、エスケープ文字は通常の文字と見なされます。
  • EOFは、 None 値で通知されます。
  • 引用符で囲まれた空の文字列()は許可されます。