※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


正規表現を扱う

re.compile()で正規表現パターンを正規表現オブジェクトにコンパイルします。
>>> import re
>>> pat = re.compile("a")

match()やsearch()、split()、sub()などは下のように正規表現オブジェクトをコンパイルする方法とそのまま用いる方法があります。
>>> import re
>>> re.compile("a").match("abcdef")
<_sre.SRE_Match object at 0xb7c05720>
>>> re.match("a","abcdef")
<_sre.SRE_Match object at 0xb7c05758>

Pythonの正規表現にはre.match()とre.search()があります。re.match()は文字列の初めからのマッチをチェックします。
re.match("a","abcdef")  #Match
re.match("c","abcdef")  #Not match
re.search("a","abcdef") #Match
re.search("c","abcdef") #Match

正規表現演算子


^ 文字列の先頭にマッチ
$ 文字列の末尾にマッチ
. 改行を除く任意の一文字にマッチ(設定により改行にマッチさせることも可能)
* 前の表現の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_])にマッチ

正規表現を条件で用いる

>>> import re
>>> if re.compile("a").search("Bacon"):
...     print("OK")
... 
OK

繰り返し文字を検索する

re.search("a*c", "abc")     #Match
re.search("a*c", "ac")      #Match
re.search("a*c", "aaaaaac") #Match
re.search("a*c", "c")       #Match
re.search("a*c", "abccccc") #Match
re.search("a*c", "abd")     #Not match

re.search("a+c", "abc")     #Not match
re.search("a+c", "ac")      #Match
re.search("a+c", "aaaaaac") #Match
re.search("a+c", "c")       #Not match
re.search("a+c", "abccccc") #Not match
re.search("a+c", "abd")     #Not match

re.search("a?c", "abc")     #Match
re.search("a?c", "ac")      #Match
re.search("a?c", "aaaaaac") #Match
re.search("a?c", "c")       #Match
re.search("a?c", "abccccc") #Match
re.search("a?c", "abd")     #Not match

特定の文字集合の要素とマッチさせる


re.search("[ABZ]", "A") #Match
re.search("[ABZ]", "Z") #Match
re.search("[ABZ]", "Q") #Not match

re.search("[0-9]", "4") #Match
re.search("[0-9]", "M") #Not match
re.search("[A-Z]", "4") #Not match
re.search("[A-Z]", "M") #Match

re.search("[^A-Z]", "4") #Match
re.search("[^A-Z]", "M") #Not match

正規表現に合致した文字列を利用する

>>> import re
>>> m = re.search(r"(\w+), (\w+)", "SPAM, Egg and Bacon")
>>> m.group(1)
'SPAM'
>>> m.group(2)
'Egg'
>>> m.group(0)
'SPAM, Egg'

>>> import re
>>> m = re.search(r"(?P<first>\w+), (?P<second>\w+)", "SPAM, Egg and Bacon")
>>> m.group("first")
'SPAM'
>>> m.group("second")
'Egg'
>>> m.group(1)
'SPAM'
>>> m.group(2)
'Egg'

>>> import re
>>> m = re.search(r"(.\d)+", "A5B6C7")
>>> m.group(1)
'C7'

フラグを指定して正規表現オブジェクトをコンパイルする

>>> import re
>>> c1 = re.compile("[A-Z]")
>>> c2 = re.compile("[A-Z]", re.IGNORECASE) #大文字・小文字を区別しない
>>> c1.search("a") #Not match
>>> c2.search("a") #Match
<_sre.SRE_Match object at 0xb7c2a758>

複数のフラグを'|'で連結することができます。

DOTALL, S '.'を改行を含む全ての文字とマッチするようにする
IGNORECASE, I 大文字・小文字を区別しない
LOCALE, L \w, \W, \b, \Bを現在のロケールに合わせる
MULTILINE, M '^'が文字列の先頭と各行の先頭に、'$'が文字列の末尾と各行の末尾にマッチするようにする
VERBOSE, X (正規表現内に'#'を用いてコメントを書くことができる)
ASCII, A \w, \W, \b, \B, \s, \SをユニコードではなくASCIIにマッチするようにする

正規表現を用いて文字列を区切る

>>> re.split(r"\W+", "SPAM, Egg, Bacon")
['SPAM', 'Egg', 'Bacon']
>>> re.split(r"(\W+)", "SPAM, Egg, Bacon")
['SPAM', ', ', 'Egg', ', ', 'Bacon']
>>> re.split(r"(\W+)", "SPAM, Egg, Bacon", 1)
['SPAM', ', ', 'Egg, Bacon']




|