255

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

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

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

学生がこの構文を覚えるのを助ける方法についてのアイデアを得たいと思っています. 「P」が何を表すか (または表す可能性があるか) を知っておくと役立ちます。

4

3 に答える 3

340

私たちは皆推測しているので、私のものをあげてもいいかもしれません.私はいつもそれがPythonの略だと思っていました. それはかなりばかげているように聞こえるかもしれません-何、Python の P?! -- しかし、私の弁護において、私は漠然とこのスレッドを思い出しました[私のものを強調]:

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

差出人: 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-porters からの最初のリクエストなので、かなり帯域幅の少ないアクティビティです。(すみません、先週はさらに低くなりました。私はニューヨークの Internet World に出かけていました。)

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

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

于 2012-04-08T03:05:34.807 に答える
23

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

于 2012-04-08T01:26:59.583 に答える