[[ノート/テキストマイニング]]~
訪問者数 &counter();      最終更新 &lastmod();

**Pythonの正規表現を確認 [#eb62d4b3]

参照
-[[Python2.7マニュアル HowTo編の正規表現:http://docs.python.jp/2/howto/regex.html]]

-[[Python2.7マニュアル re — 正規表現操作:http://docs.python.jp/2/library/re.html]]

サンプル
- [[Pythonで学ぶ 基礎からのプログラミング入門 (13) 正規表現をマスターしよう | マイナビニュース:http://news.mynavi.jp/series/python/013/]]

- [[[Python] 何度も調べてしまうリスト操作をまとめてみた - YoheiM .NET:http://www.yoheim.net/blog.php?q=20150801]]

- [[お気楽 Python プログラミング入門:http://www.geocities.jp/m_hiroi/light/python04.html]]

- [[Pythonでの正規表現の使い方 - Qiita:http://qiita.com/wanwanland/items/ce272419dde2f95cdabc]]

**まとめると [#k393ee72]
まず、よく使いそうな正規表現そのもの
 ? : 0回か1回の繰り返し
 + : 1回以上の繰り返し
 * : 0回以上の繰り返し
 {m,n} : 最小m回で最大n回
 ^ : 文字列の先頭
 $ : 文字列の末尾
 . : 任意の一文字(なんでもいい)
 [] : 文字クラスの指定。[]のうちに記されたいずれか

 \d : 任意の十進数
 \D : 数字以外の文字すべて
 \s : 空白文字。タブや改行なども含まれる
 \S : 空白文字以外の文字すべて
 \w : アルファベット、数字、下線のすべて
 \W : アルファベット、数字、下線以外のすべて
で、あとはエスケープ\に気を付けること。

正規パターンを文字列としておくのだが、pythonでは接頭文字rを付けることになっている。
 r'[1-9]%%[a-z]'
ユニコード文字を使いたければ接頭文字はuでいいらしい。

この正規表現(パターン)を、予めコンパイルしておくことができる。
 p = re.compile(r'[a-z]')

次に、正規表現を使う側のやり方は、いくつかあるみたい。まずmatchとsearch、それにgroup。
-match 調べたい文字列が、指定した正規表現にmatchしているか判定。先頭から比較
-search 調べたい文字列の中に、指定した正規表現が含まれているかを検索。途中から含まれているのもよい。
 import re
 # match  先頭からのみ対応
 print(re.match('\d+', '123abc') != None)   # True
 print(re.match('\d+', 'abc123') != None)   # False
 
 # search
 print(re.search('^\d+', '123abc') != None) # True
 print(re.search('^\d+', 'abc123') != None) # False
 print(re.search('\d+', 'abc123') != None)  # True
一致した場合の結果(Matchオブジェクト)は、中にいろいろな情報が入っている。
 m = re.search('\d+', 'abc123def')
 print(type(m))   # <type '_sre.SRE_Match'>   Matchオブジェクトタイプが返る
 print(m.group()) # 123     groupはマッチした対象部分
 print(m.start()) # 3       startは開始位置
 print(m.end())   # 6       endは修了位置
 print(m.span())  # (3, 6)  spanは (start,end)

いろいろな変種がある。
 l = re.findall('\d+', '123abc456def')
 print(l) # ['123', '456']
 
 l = re.findall('\d+', 'abc def')
 print(l) # []  該当なしなので空

置換えは、subが使える
 re.sub(r'\d+', 'xxx', '123abc456def')

[[貪欲vs非貪欲:http://docs.python.jp/2/howto/regex.html#greedy-versus-non-greedy]]
 u = re.match('<.*>', '<html><head><title>Title</title>')
 print u.span(), u.group()   # (0, 32) <html><head><title>Title</title>
となり、<>のペアでは無く、最長の<>になっている。これは具合が悪いことも多いので、.*でなくて.*?とすると
 u = re.match('<.*>', '<html><head><title>Title</title>')
 print u.span(), u.group()   # (0, 6) <html>
とできる。



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS