正規表現を扱う
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']
最終更新:2009年11月22日 14:26