![]() |
ノート/テキストマイニング/正規表現を確認https://pepper.is.sci.toho-u.ac.jp:443/pepper/index.php?%A5%CE%A1%BC%A5%C8%2F%A5%C6%A5%AD%A5%B9%A5%C8%A5%DE%A5%A4%A5%CB%A5%F3%A5%B0%2F%C0%B5%B5%AC%C9%BD%B8%BD%A4%F2%B3%CE%C7%A7 |
![]() |
ノート/テキストマイニング
訪問者数 851 最終更新 2016-02-29 (月) 13:45:44
参照
サンプル
まず、よく使いそうな正規表現そのもの
? : 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。
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')
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>
とできる。