正規表現
モジュール【re】をインポートして利用する
re.search() ※文字列の中からマッチするか調べる
第1引数:正規表現
第2引数:対象文字列
第3引数:オプション ※大文字・小文字を区別したくない場合は re.IGNORECASE を設定する
例)
import re
str = 'foohogebar'
m = re.search(r'hoge', str) ※ヒットするとオブジェクトを返却(ダメだと None)
print( m ) ※<_sre.SRE_Match object; span=(3, 7), match='hoge'> このままでは使えない
print( m.span() ) ※(3, 7) ヒットした文字列の最初と最後の文字数をタプル型で返却する
print( str[ m.span()[0] : m.span()[1] ] ) ※hoge と表示する
正規表現中の特定の文字列をカッコで囲うと[groups]メソッドを利用できます。
例)
電話番号を表現するパターンは以下となる
0\d{1,4}-\d{1,4}-\d{1,4}
電話番号の[国内プレフィックス][市外局番][加入者番号]をそれぞれ知りたい場合は以下の様にカッコで囲う
(0\d{1,4})-(\d{1,4})-(\d{1,4})
こうする事で、各カッコの内容を[groups]メソッドで取得する事ができる
import re
tel = '04-7144-5187'
m = re.search(r'(0\d{1,4})-(\d{1,4})-(\d{1,4})', tel)
print( m.groups() ) ※('04', '7144', '5187') 各内容がタプル型で取得できる
[groups]メソッドはカッコが多くなると何番目が必要な値か分かりにくくなります。
そんな場合は[groupdict]メソッドが便利です。
「(」~「)」で囲っていたかわりに「(?P<name>」~「)」で囲うだけです。 ※name はユニークな文字列
例)
m = re.search(r'(?P<tel1>0\d{1,4})-(?P<tel2>\d{1,4})-(?P<tel3>\d{1,4})', tel)
print( m.groupdict() ) ※{'tel1': '04', 'tel3': '5187', 'tel2': '7144'} 辞書型で取得できる
正規表現で文字列を置換する
[sub]メソッドを利用する
第1引数:正規表現
第2引数:置換方法
第3引数:対象の文字列
● 単純な置換
例)
import re
str = 'みんなでPythonの勉強をしよう。。'
str = re.sub(r'Python','PHP',str)
print(str) みんなでPHPの勉強をしよう。。
● グループを使った置換1
例)
import re
tel = re.sub(r'(0\d{1,4})-(\d{1,4})-(\d{1,4})', r'\1\2\3', '04-7144-5187') ※「\1」で1グループを指す
print(tel) 0471445187
● グループを使った置換2
例)
import re
tel = re.sub(r'(?P<tel1>0\d{1,4})-(?P<tel2>\d{1,4})-(?P<tel3>\d{1,4})', r'\g<tel1>\g<tel2>\g<tel3>', '04-7144-5187')
print(tel) 0471445187
● 関数を使った置換
置換方法に関数を使う事ができる。
関数を使う場合は引数として勝手にマッチしたオブジェクトが渡されます。
例)
import re
def
replace_phone_xxxx(m): ※[m]は、マッチしたオブジェクト
d = m.groupdict()
return '*' * len(d['tel1']) + '-' + '*' * len(d['tel2']) + '-' + '*' * len(d['tel3'])
tel = re.sub(r'(?P
0\d{1,4})-(?P\d{1,4})-(?P\d{1,4})', replace_phone_xxxx, '04-7144-5187')
print(tel) **-****-****
【メモ】
基本的に正規表現の検索範囲は1行となり、改行文字をまたぐ検索や置換はできません。
しかし、定数 re.DOTALL を設定する事により、何でも文字の「.」が改行文字も含む様になります。
例)
import
re
p =
re.
compile(r'<[^>]*?>',
re.
DOTALL) ※html の全てのタグを削除する
p.sub('', html)
※compile メソッドに設定するのは置換の場合の sub メソッドに設定する番目がないため(名前付き引数があるかは不明。。)
r'<a.*?/a>' とすると、<a href="...">hoge</a> を全て置換対象とできます。
正規表現色々
str = 'ひらがなのみ'
m = re.search(r'^[ぁ-ん]+$',str)
print(m)
str = 'ひらが な のみ'
m = re.search(r'^[ぁ-ん ]+$',str) ※「 」「 」含む
print(m)
str = 'カタカナノミー'
m = re.search(r'^[ァ-ヶー]+$',str)
print(m)
str = 'カタ カ ナノミー'
m = re.search(r'^[ァ-ヶー ]+$',str) ※「 」「 」含む
print(m)
str = 'abあc'
m = re.search(r'[ぁ-ん]+',str) ※1文字でもひらがなを含む
print(m)
str = 'aカbc'
m = re.search(r'[ァ-ヶ]+',str) ※1文字でもカタカナを含む
print(m)
str = 'a馬bc'
m = re.search(r'[一-龠]+',str) ※1文字でも漢字を含む
print(m)
str = '1234567'
m = re.search(r'^[0-9]{7}$',str) ※数値で7桁のみ
print(m)
str = '
[email protected]'
m = re.search(r'^[^0-9][a-zA-Z0-9_-]+([.][a-zA-Z0-9_-]+)*[@][a-zA-Z0-9_-]+([.][a-zA-Z0-9_-]+)*[.][a-zA-Z]{2,4}$',str)
if m != None:
print('メールアドレスかな')
else:
print('メールアドレスじゃない')
html_tag = '<a href="http://www.hogehoge.com/hogehoge/hoge/sample.html" class="hogehoge" title="hogehoge">りんく</a>'
m = re.search(r'<A href=\"(.*?)\".*?>(.*?)</a>',html_tag,re.IGNORECASE)
print(m.groups())
※('http://www.hogehoge.com/hogehoge/hoge/sample.html', 'りんく') タプル型で返却される