reモジュールをインポートする必要あり。
pythonでは、マッチングのための演算子はないようだ。re.match および re.search メソッドでマッチングを行う。
re.match は最初からのマッチに限定、 re.search は最初とは限定しないマッチ。
いずれも、第1引数にパターン(を表す文字列str)、 第2引数の比較対象の文字列を渡す。
これらの関数は マッチすればmatchオブジェクト(しなければ、論理的に「偽」を表す None)を返す。
import re
print(re.match('abc','abc') and 'matched')
print(re.match('b','abc') and 'matched')
print(re.search('b','abc') and 'found')
なお、正規表現に使われるメタ文字とその意味については、言語によらず概ね同じなので、ここでは(言語毎の特記事項がない限り)省略する。
s='abc'
print(re.search('a',s))
print(re.search('b',s))
print(re.search('.a',s)) # aの左に文字はない
print(re.search('.b',s)) # . は a にマッチ
print(re.search('.',s))
print(re.search('...',s))
print(re.search('....',s))
matchオブジェクトが含む情報については、 REPL(インタプリタ)の出力から概ね推察できるだろう。
s='abcde'
print(re.search('a...e',s))
print(re.search('ab[cde]',s))
print(re.search('a.*e',s))
アンカー(^
や $
)もpython
に(も)ある。^
については、match と
searchの使い分けでも代用できる(ことが多い)。
print(re.match('b','abcde'))
print(re.search('^b',abcde'))
キャプチャの方法はRubyと同じく ( )
で囲む。
matchオブジェクトのメソッド .group(N) で後方参照できる。(Nとして何番目の括弧であるかを表す整数を渡す。0を渡した時はマッチ全体が値となる。)
m=re.match('a(.*)e',abcde)
m.group(1) # => bcd'
pythonは正規表現を / で囲まないので、Rubyの%r記法のようなものは必要性はないようだ。
’' によるエスケープは有効。
このバックスラッシュがエスケープとして使われるためには、r'\s+'
のように、 接頭辞 r をつけて raw文字列にしておくといいようだ。
m=re.match(r'(\S+):(\d+)','proxy:3128')
if m: host,port=m.group(1),m.group(2)
# または
host,port='proxy:3128'.split(':')
# 後者の書き方はRubyと同じ
m=re.match(r'\S+://(\S+)(/.*)',"http://www2.nagano.ac.jp/hiraoka/NP")
if m: domain, pathname=m.group(1), m.group(2)
# or 最短マッチの記法を使って(Rubyと同様)
m=re.match(r'\S+://(\S+?)(/.*)',"http://www2.nagano.ac.jp/hiraoka/NP")