webdevqa.jp.net

名前付き正規表現グループ「(?P <グループ名> regex)」:「P」は何を表していますか?

Pythonでは、(?P<group_name>…)syntax を使用すると、名前で一致した文字列を参照できます。

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

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

生徒がこの構文を覚えるのを助ける方法についてのアイデアを得たいと思います。 「P」が何を表しているか(または表しているかもしれない)を知っていると便利です。

151
Eric O Lebigot

私たちは皆推測しているので、私は私のものを与えるかもしれません:私はいつもそれがPythonを意味すると思っていました。それはかなりばかげているように聞こえるかもしれません-なに、P for Python ?! -しかし、私の防衛では、私は漠然と覚えていました このスレッド [私の強調]:

件名:(?P ...)正規表現構文の拡張を要求する

From:Guido van Rossum(gui ... @ CNRI.Reston.Va.US)

日付:1997年12月10日午後3時36分19秒

Perl開発者(Perl言語を開発する開発者)に異常な要求があります。これ(Perl5-porters)が正しいリストであることを願っています。 Python string-sigをcc 'しているのは、ここで説明しているほとんどの作業の起源であるためです。

おそらくPythonを知っているでしょう。私はPythonの作成者です。今年の終わりまでに、次の「メジャー」バージョンPython 1.5をリリースする予定です。今後PythonとPerlが共存できることを願っています。相互受粉は両方の言語に適しています。 (LarryがPerl 5にオブジェクトを追加したときにPythonをよく見ていたと思います; O'Reillyは両方の言語に関する本を出版しています。)

ご存知かもしれませんが、Python 1.5は、Perlの構文により厳密に一致する新しい正規表現モジュールを追加します。 Pythonの構文内で可能な限りPerl構文に近づけるように努めました。ただし、正規表現構文にはPython固有の拡張機能がいくつかあり、すべてが(?Pで始まります。現在、次の2つがあります。

(?P<foo>...)通常のグループ化括弧に似ていますが、テキスト
グループが一致したものは、シンボリックグループ名「foo」を介して、一致が実行された後にアクセスできます。

(?P=foo)は、「foo」という名前のグループと一致する文字列と一致します。グループが参照されることを除いて、\ 1、\ 2などと同等です。
番号ではなく名前で。

このPython固有の拡張機能が、Perl正規表現構文に対する将来のPerl拡張機能と競合しないことを願っています。 (?P、使用する予定がある場合は、できるだけ早くお知らせください。競合を解決できるようにします。それ以外の場合は、(?P Python固有の構文拡張機能用。(拡張機能のレジストリはありますか?)

ラリー・ウォールが答えた:

[...]現在のところレジストリはありません。あなたのはPerl5ポーター以外からの最初のリクエストであるため、かなり低帯域幅のアクティビティです。 (申し訳ありませんが、先週はさらに低かったです。ニューヨークのインターネットワールドで休みました。)

とにかく、私に関する限り、あなたは確かに私の祝福に「P」を持っているかもしれません。 (明らかに、Perlはこの時点で 'P'を必要としません。:-) [...]

だから、Pの最初の選択が何によって動機付けられたのかはわかりません-パターン?プレースホルダー?ペンギン? -しかし、私がいつもPythonに関連付けている理由は理解できます。 (1)正規表現が好きではなく、可能な限り避けること、そして(2)このスレッドが15年前に起こったことを考えると、ちょっと奇妙です。

217
DSM

パターン!グループは、後で正規表現で使用するために(サブ)パターンを指定します。そのようなグループの使用方法の詳細については、 こちらのドキュメント をご覧ください。

18
Mike