pythonで正規表現を使う方法を簡単に記載する。
pythonの正規表現では良く
・compile
・findall
が使われる。とりあえずは、この二つだけを解説する。
compileは正規表現のマッチングパータンを記述し、登録するメソッドで
findallでそのパターンを使って、引数の文字列から情報を見つけるメソッドである。それぞれの使い方は以下のとおり。
■compile
regexp = re.compile( 正規表現をかく )
カッコの所に正規表現をかく。その正規表現にマッチしているものを探す。
■findall
ret = regexp.findall( string )
Stringのパターンを渡して、そのStringの中からコンパイルで指定した条件の文章を抽出する。
実際的な使い方を以下に示す。
|
|
compileに書いた正規表現の意味だが、
「<td>ではじまり、任意の一文字(改行以外)の0文字以上の繰り返しをしたあと</td>でおわる文字列」という意味である。
ドットが任意の一文字を表し、コメがあるパターンの0文字以上の繰り返しを表す。
また、?の意味は最小でマッチング行うということを意味する。この最小マッチングとは、例えば
<td>a</td>
<td>b</td>
というのがあった場合に、?を使わないで記述すると(つまりcompile( '<td>.*</td>' ))
最初のtdと最後の/tdがマッチングされてしまう。(最長の部分のマッチングを探してしまう)。これが嫌な場合はパターンに?をいれる。そうすることで最小マッチング、上記の例で言えば二つ抽出される。
尚注意であるが、.は任意の一文字だが実は改行は含まれない。改行も含まれるようにするにはフラグを立てる。以下のようにする。
regexp = compile( '<td>.*?</td>', re.DOTALL )
とする。
他にもフラグとして以下のようなものがあり、複数のフラグを'|'で連結することで調整ができる
| フラグ名 | フラグ名短縮形 | 解説 |
|---|---|---|
| DOTALL | S | '.'を改行を含む全ての文字とマッチするようにする |
| IGNORECASE | I | 大文字・小文字を区別しない |
| LOCALE | L | \w, \W, \b, \Bを現在のロケールに合わせる |
| MULTILINE | M | '^'が文字列の先頭と各行の先頭に、'$'が文字列の末尾と各行の末尾にマッチするようにする |
| VERBOSE | X | (正規表現内に'#'を用いてコメントを書くことができる) |
| ASCII | A | \w, \W, \b, \B, \s, \SをユニコードではなくASCIIにマッチするようにする |
パターンに関しては以下を参考のこと。
| ^ | 文字列の先頭にマッチ |
| $ | 文字列の末尾にマッチ |
| . | 改行を除く任意の一文字にマッチ(設定により改行にマッチさせることも可能) |
| * | 前の表現の0回以上の繰り返しの文字列にマッチ(greedy, 可能な限り長い文字列にマッチ) |
| + | 直前の表現の1回以上の繰り返しの文字列にマッチ(greedy, 可能な限り長い文字列にマッチ) |
| ? | 直前の表現の0回(空文字列)または1回の繰り返しの文字列にマッチ(greedy, 可能な限り長い文字列にマッチ) |
| *? | "*"のnon-greedy版 |
| +? | "+"のnon-greedy版 |
| ?? | "?"のnon-greedy版 |
| {n,m} | 直前の表現のn回以上m回以下の繰り返しの文字列にマッチ(greedy, 可能な限り長い文字列にマッチ) |
| {n,m}? | "{n,m}"のnon-greedy版 |
| {n} | 直前の表現のn回の繰り返しの文字列にマッチ |
| {n,} | 直前の表現のn回以上の繰り返しの文字列にマッチ |
| [...] | 定義した文字集合の要素とマッチ |
| [^...] | 定義した文字集合の補集合要素とマッチ |
| (...) | グループ化 |
| \d | 任意の数字([0-9])にマッチ |
| \D | 任意の非数字([^0-9])にマッチ |
| \s | 任意のホワイトスペース([ \t\n\r\f\v])にマッチ |
| \S | 任意の非ホワイトスペース([^ \t\n\r\f\v])にマッチ |
| \w | 任意の英数字([a-zA-Z0-9_])にマッチ |
| \W | 任意の非英数字([^a-zA-Z0-9_])にマッチ |
compile, findall 意外に関してはpythonの標準関数のドキュメントを参考にする。
株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house