Pythonでパーサを自作するならPyParsingがおススメ

Pythonでパーサを自作するならPyParsingがおススメ プログラミング

パーサ(構文解析プログラム)を自作したことがありますか?
おおがかりなモノではなく、関数でも構いません。

そうだとしたら、パーサを自作したことはあるはずです。
プログラミングを行う上では、パーサが必要になるケースが多々あります。

では、みなさんはパーサをどうやってプログラミングしていますか?
ベタベタにコーディングしたり、正規表現を多用したりしていませんか?

白状します。
私は、両方しています。

でも、今後はできるだけ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の動作確認を説明しました。

タイトルとURLをコピーしました