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


178

Pythonでは、 (?P<group_name>…) 構文により、一致する文字列をその名前で参照できます。

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

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

生徒がこの構文を覚えやすくする方法についてのアイデアが欲しいです。「P」が何を表す(または表すかもしれない)かを知ることは有用でしょう。


8
Pの略ですPlaceholder
kev 2012

1
@kev:それが答えであるように思われますか?
ninjagecko 2012

3
推測は適切なので、ケントンプソンはヒッピーの共感者であり、「P」は「パチョリ」の略であると推測します。
aaronasterling 2012

2
この質問は、「グループ」の下のスタックオーバーフローの正規表現に関するFAQに追加されました。
aliteralmind 2014

6
ちなみに、match.groups(を使用してs)を使用すると、すべてのグループのタプルが暗黙的に取得されます-_- groups('name')=> ('John', '123456')実際に必要だったのがgroup('name')=>の場合 => 'John' これにより、誰かがいつかどこかで救われることを願っています。
szmoore 2017

回答:


262

私たち全員が推測しているので、私も同じように考えます。これは、Pythonの意味であると常に思っていました。それはかなりばかげて聞こえるかもしれません-PythonのPとは!?-しかし私の弁護では、このスレッドをぼんやりと思い出しました [強調は私のものです]:

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

差出人:グイドファンロッサム(gui ... @ CNRI.Reston.Va.US)

日付:1997年12月10日15: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固有の構文拡張用に永久的に予約できれば便利です。 (Is拡張機能のある種のレジストリはありますか?)

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

[...]現在のところ、レジストリはありません。あなたのものは、外部のperl5-portersからの最初のリクエストであるため、かなり低帯域幅のアクティビティです。(申し訳ありませんが先週はさらに低くなりました-私はニューヨークのInternet Worldにいました。)

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

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


4
「Python固有の拡張機能」でしょうか?
jmort253 2012

50
うわー、あなたはここでいくつかの良い関連データを見つけました!Guidoの投稿に対する私の解釈では、「P」は「Python固有の拡張機能」を表します。
Eric O Lebigot 2012

1
うん、それは私にとって決定的に見えます。つまり、Pythonが名前付きキャプチャをサポートする最初のフレーバーだったからといって、PerlとPCREが最初に構文をコピーしたのは皮肉なことです。しかし、それらは(?<group_name>…)構文もサポートします。これは最も人気があるようです-Javaでも現在サポートしています。
アランムーア

3
+1これは十分に防御されている、最も厄介な答えの1つです:)。最初は、これはバカすぎると思いました。しかし、結局、私は完全に同意しました。
Sumudu 2018年

4
Pythonの作成者でさえ、Perlが関わっているときは奇妙な難解な構文を使用していることを気に入っています。Perlコミュニティはそれでまったく問題ありません。Perl固有の拡張機能/構文をPythonに追加しようとすると、通りに血が流れます。
キースリプリー

20

パターン!グループは、後で正規表現で使用するために(サブ)パターンに名前を付けます。参照してくださいここにドキュメントをどのように使用されるか、そのようなグループの詳細については。


3
+1:これは優れたニーモニックデバイスです。(?P<name>…)「パターンname」です。ただし、正規表現ではすべてがパターンであるため、(?P<…>…)グループをパターンとしてラベル付けするだけでは奇妙です。しかし、これは私の生徒には有効です。:)
Eric O Lebigot 2012

1
@EOLは学生に虚偽のことを教えません。正確さを求めると、想像以上に細断するのが難しくなります。例えば。私にとっては、何年もかかるものもあり5ます。逆説的に言えば、何気なく話すことをお勧めします。常に、それについて常に非常に明確で明確にしてください。あなたの生徒への完全な長さで、あなたの以前のコメント教えて(おそらく非常に最後の文を改訂する;))。
n611x007

5

Python拡張。Python Docosから:

Perl開発者が選択した解決策は、拡張構文として(?...)を使用することでした。?括弧の直後は構文エラーでした。繰り返す必要がないので、互換性の問題は発生しませんでした。?の直後の文字 使用されている拡張子を示します。したがって、(?= foo)は1つ(肯定的な先読みアサーション)であり、(?: foo)は他のもの(部分式fooを含む非キャプチャグループ)です。

PythonはいくつかのPerlの拡張機能をサポートし、Perlの拡張構文に拡張構文を追加します。疑問符の後の最初の文字がPの場合、それはPythonに固有の拡張であることを知っています。

https://docs.python.org/3/howto/regex.html


よくわかりました!これはDSMの気持ちを裏付けています。
Eric O Lebigot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.