1. ホーム
  2. パイソン

[解決済み】名前付き正規表現グループ "(?P<group_name>regexp)": "P" とは何の略ですか?

2022-04-21 10:22:28

質問

Pythonでは (?P<group_name>…) 構文 は、マッチした文字列をその名前を通して参照することを可能にします。

>>> import re
>>> match = re.search('(?P<name>.*) (?P<phone>.*)', 'John 123456')
>>> match.group('name')
'John'

P"Pは何の略ですか? の中にヒントが見つかりませんでした。 公式ドキュメント .

生徒にこの構文を覚えさせる方法について、ぜひアイデアを頂きたいのです。P"が何を表しているのか(あるいは表している可能性があるのか)を知ることは有用でしょう。

どのように解決するのですか?

せっかくなので、私なりの推測を。私はずっとPythonの略だと思っていました。 PはPythonの略か?-- と思われるかもしれませんが、私の防衛手段としては、なんとなく次のことを思い出しました。 このスレッド [強調)。

件名 主張する (?P...) 正規表現構文の拡張機能

From Guido van Rossum ([email protected])

日付 1997年12月10日 15時36分19秒

Perlの開発者(開発している人)に変わったお願いがあります。 Perl言語)。 ここ(perl5-porters)が正しいリストであることを祈ります。 I Pythonのstring-sigをccしているのは、Pythonのstring-sigがほとんどの元になっているからです。 ここで議論している仕事

Pythonはご存知の方も多いと思います。 私はPythonの生みの親です。 Python 1.5をリリースする予定です。 今年もよろしくお願いします。 PythonとPerlがこれから先も共存していけるようにと願っています。 両言語にとって、相互受粉は良いことです。 (私はラリーが Perl 5にオブジェクトを追加したとき、Pythonをよく見ていた; O'Reilly 両方の言語についての本を出版しています)。

ご存知のように、Python 1.5では、新しい正規表現モジュールが追加されました。 よりPerlの構文に近くなっています。 私たちは、Perlの構文にできるだけ近づけようとしました。 Pythonの構文の中で、Perlの構文を可能な限り使用します。 しかし、正規表現 の構文にはPython特有の拡張機能があり、それらはすべて(?P .)で始まっています。 現在、2つあります。

(?P<foo>...) 通常のグループ化括弧と似ていますが、テキストの

にマッチしたグループには、マッチが実行された後にアクセスできます。 シンボリックグループ名 "foo"を介して。

(?P=foo) という名前のグループがマッチする文字列と同じ文字列にマッチします。 foo"です。 グループが参照されることを除いては、 \1, \2, などと同等です。

を番号ではなく、名前で指定する。

このPython固有の拡張が、他のPythonの拡張と衝突しないことを望みます。 将来、Perlの正規表現構文が拡張される予定です。 もし を使用する場合は、できるだけ早くお知らせください。 の競合が発生します。 そうでなければ、(?P)構文が(?P)構文であることが望ましい。 は、Python 固有の構文拡張のために永久に予約されています。 (この 拡張機能のレジストリみたいなものがあるのでしょうか?)

という質問に対して、ラリー・ウォールが答えた。

[...] 今のところレジストリはありません。 perl5-portersの外部では、かなり低帯域の活動です。 (先週はもっと低くてすみません。私はニューヨークのInternetでオフでした。 ワールド)

とにかく、私の知る限りでは、あなたが'P'を持つことは間違いないでしょう。 の祝福を受ける。(明らかにPerlはこの時点で'P'を必要としていません。 :-) [...].

だから、Pが最初に選ばれた動機が何だったのかはわかりません -- パターン? プレースホルダー?-- でも、なぜ私がずっとPythonと結びつけてきたかはおわかりいただけると思います。 (1)私は正規表現が嫌いで、可能な限り避けていること、(2)このスレッドが15年前に起こったことを考えると、ちょっと奇妙な感じですね。