パーサ(構文解析プログラム)を自作したことがありますか?
おおがかりなモノではなく、関数でも構いません。
そうだとしたら、パーサを自作したことはあるはずです。
プログラミングを行う上では、パーサが必要になるケースが多々あります。
では、みなさんはパーサをどうやってプログラミングしていますか?
ベタベタにコーディングしたり、正規表現を多用したりしていませんか?
白状します。
私は、両方しています。
でも、今後はできるだけPyParsingを使うようにします。
本記事の内容
- PyParsingとは?
- PyParsingのシステム要件
- PyParsingのインストール
- PyParsingの動作確認
それでは、上記に沿って解説していきます。
PyParsingとは?
PyParsingとは、構文解析用のライブラリです。
PyParsingを使うと、正規表現で行っているようなことをシンプルに実現できます。
正規表現は、どうしてもコードの可読性が良くありません。
書いた本人以外は、「?」ということにしばしばなりがちです。
もっと言うと、書いた本人ですら時間が経つと「?」となります。
PyParsingには、そのような事態を防ぐ効果があります。
もちろん、PyParsingを扱うためにはそのルールを学ばないといけません。
ここで「PyParsingを学ぶ価値はあるのか?」と疑問になるはずです。
GiuHub上のリポジトリを見てください。
PyParsing はモジュールとしては、そこそこスターがある方です。
パーサを自作することが多いなら、PyParsingを学ぶ価値があるでしょう。
以上、PyParsingについて説明しました。
次は、PyParsingのシステム要件の確認を行います。
PyParsingのシステム要件
現時点(2021年4月)でのPyParsingの最新バージョンは、2.4.7となります。
この最新バージョンは、2020年4月6日にリリースされています。
あくまで2.4.7は、安定バージョンです。
すでにPyParsingの公式では、3.0.0が公表されています。
まだ、3.0.0は開発版のようです。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
そして、サポート対象となるPythonのバージョンは以下。
- Python 2.6
- Python 2.7
- Python 3.3
- Python 3.4
- Python 3.5
- Python 3.6
- Python 3.7
- Python 3.8
基本どんなバージョンでもOKという感じです。
Python 3.9も問題なく動きます。
ただし、PyParsing 3.0.0になれば、Python 3.5以降しかサポートしないようです。
PyParsing 3.0.0では、古いPythonを切り捨てたということでしょう。
古いPythonでも動くように(互換性を維持)するコストは、結構バカになりませんからね。
以上、PyParsingのシステム要件の説明でした。
次は、PyParsingをインストールしていきます。
PyParsingのインストール
最初に、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ---------- ------- pip 21.0.1 setuptools 56.0.0
次にするべきことは、pip自体の更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip
では、PyParsingのインストールです。
PyParsingのインストールは、以下のコマンドとなります。
pip install pyparsing
インストールは、一瞬で終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。
>pip list Package Version ---------- ------- pip 21.0.1 pyparsing 2.4.7 setuptools 56.0.0
PyParsingの他には何もインストールされていません。
そのため、どんな環境でも容易に導入が可能です。
以上、PyParsingのインストールの説明でした。
最後に、PyParsingの動作確認を行います。
PyParsingの動作確認
公式にあるサンプルコードです。
from pyparsing import Word, alphas greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print(hello, "->", greet.parseString(hello))
上記を実行すると、以下のような結果が表示されます。
Hello, World! -> ['Hello', ',', 'World', '!']
見ればわかりますが、「greet」という構文のルールを作っています。
そのルール通りの文字列であれば、リスト形式に分割されます。
仮に、次のような文字列にするとします。
hello = "Hello World!"
この状態で実行すると、以下のようなエラーとなります。
pyparsing.ParseException: Expected ",", found 'W' (at char 6), (line:1, col:7)
マッチングの度にエラーが出るのは、問題です。
そのため、例外対応しましょう。
from pyparsing import Word, alphas from pyparsing import ParseException greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello World!" try: print(hello, "->", greet.parseString(hello)) except ParseException: print(hello, "->", "No!!")
上記を実行すると、以下が表示されます。
Hello World! -> No!!
以上、PyParsingの動作確認を説明しました。