0

正規表現エンジンにカスタム拡張機能を追加する簡単な方法はありますか? (特にPythonの場合ですが、一般的な解決策もとります)。

私が構築しようとしているものを例で説明する方が簡単かもしれません。私が考えているユースケースは次のとおりです。

ユーザーが任意の ASCII 文字を含む可能性のある文字列を照合できるようにしたい。正規表現は良い出発点ですが、私が考えているデータの種類には十分ではありません。たとえば、次のような文字列を含むデータがあるとします。

<STX>12.3,45.6<ETX>

ここで<STX>、 および<ETX>は、テキストの開始/テキストの終了文字 0x02 および 0x03 です。2 つの数値を取得するには、ユーザーが式で任意の ASCII 文字を指定できると非常に便利です。そのようなもの:

\x02(\d\d\.\d),(\d\d\.\d)\x03

"\x02" と "\x03" は制御文字に一致し、最初と 2 番目の一致グループは数字です。つまり、いくつかのドメイン固有のアドオンを備えた正規表現のようなものです。

これを行うにはどうすればよいですか?これは正しい方法ですか?この種の問題は解決されたと信じていますが、最初の検索では有望なものは何も見つかりませんでした. 正規表現には、よく知られているという利点があり、学習曲線を低く抑えます。

いくつかのメモ:

  • 特定のプロトコル用の固定パーサーを探しているわけではありません。一般的で、ユーザーが構成できる必要があります。
  • 自分の正規表現エンジンを書きたくない
  • それはいいことですが、いくつかの一般的な式のショートカットを作成する「正規表現マクロ」を探しているわけではありません。(おそらくフォローアップの質問...)
  • おまけ: 「ドメイン固有の検索言語の作成」などの学術研究について聞いたことがありますか?

編集:これまでの返信に感謝しますre.Pythonが任意のASCII文字をサポートしていることに気づきませんでした. しかし、これはまだ私が探しているものではありません。最終的に私が望むものの幅をうまく与えてくれる別の例を次に示します。

次のような文字列を含むデータがあるとします。

$\x01\x02\x03\r\n

123は 2 つの 12 ビット整数 (0x010 と 0x023) を形成します。では、ユーザーが次のような正規表現と照合できるように、構文を追加するにはどうすればよいですか。

\$(\int12)(\int12)\x0d\x0a

\int12それぞれ 12 ビットを引き出します。これは、パックされたデータを検索しようとする場合に便利です。

4

1 に答える 1

2

\xエスケープは、Python正規表現パーサーによってすでにサポートされています。

>>> import re
>>> regex = re.compile(r'\x02(\d\d\.\d),(\d\d\.\d)\x03')
>>> regex.match('\x0212.3,45.6\x03')
<_sre.SRE_Match object at 0x7f551b0c9a48>
于 2012-10-01T19:01:04.463 に答える