2008年11月14日 開始
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 http://www.python.jp/Zope/articles/tips/regex_howto/regex_howto_4 4.3. 取り出さないグループと名前付きグループ凝った正規表現を書こうとすると、文字列を取り出すためのグループと、正規表現自体を構造化するためのグループを使う場合があります。しかし、複雑な正規表現では、グループ番号を追いかけ続けるのが困難になります。この問題を解決するのに 2 つの方法があります。両方とも正規表現で拡張された、一般的な文法を使うので、まずそれを見ていきましょう。 Perl 5 では、標準の正規表現の他にいくつかの機能が加えられ、Python の Python では、 Perl の拡張文法に、さらに拡張文法を追加されています。 Python で拡張されたものは、疑問符直後の最初の文字が " ここまで見てきた一般的な拡張文法を踏まえて、複雑な正規表現中のグループを扱うことを単純にする機能に話を戻しましょう。グループは左から右へと番号づけされ、複雑な正規表現では多くのグループを使います。したがって、正しい番号を追いかけるのが難しくなり、そのような複雑な正規表現を修正するのはやっかいです。先頭付近に新しいグループを挿入すれば、それ以降の全ての番号を変更することになるからです。 グループの内容を取得しないけれども、正規表現の一部を集めるために、グループを使いたい場合があります。これを明示するには、非取得グループを示す >>> m = re.match("([abc])+", "abc") >>> m.groups() ('c',) >>> m = re.match("(?:[abc])+", "abc") >>> m.groups() () マッチしたグループの内容を取得できないという事実を除けば、非取得グループは内容を取得できるグループとまったく同じように振舞います。この中に何か別の表現を入れたり、" より重要な機能は名前付きグループです。グループを番号で参照するのではなく、名前で参照できるのです。 名前付きグループの文法は Python の独自拡張のひとつで、 >>> p = re.compile(r'(?P<word>\b\w+\b)') >>> m = p.search( '(((( Lots of punctuation )))' ) >>> m.group('word') 'Lots' >>> m.group(1) 'Lots' 名前付きグループを使えば、番号を覚える代わりに、覚えやすい名前で参照できるので便利です。 imaplib モジュールから、正規表現の例を示します。 InternalDate = re.compile(r'INTERNALDATE "' r'(?P<day>[ 123][0-9])-(?P<mon>[A-Z][a-z][a-z])-' r'(?P<year>[0-9][0-9][0-9][0-9])' r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])' r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])' r'"')
>>> p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)') >>> p.search('Paris in the the spring').group() 'the the' PR |
カテゴリー
最新記事
(05/13)
(06/22)
(06/22)
(12/20)
(12/19)
(10/08)
(09/20)
(05/31)
(05/10)
(04/18)
(02/08)
(01/30)
(01/29)
(01/29)
(01/07)
(01/06)
(12/30)
(12/30)
(12/26)
(12/24)
カレンダー
リンク
フリーエリア
最新CM
最新TB
プロフィール
HN:
No Name Ninja
性別:
非公開
ブログ内検索
アーカイブ
最古記事
(05/10)
(11/14)
(11/17)
(11/21)
(11/30)
(11/30)
(12/02)
(12/02)
(12/04)
(12/06)
(12/06)
(12/06)
(12/06)
(12/07)
(12/07)
(12/07)
(12/07)
(12/13)
(12/13)
(12/19)
P R
カウンター
ブログの評価 ブログレーダー
|