読者です 読者をやめる 読者になる 読者になる

あれもPython,これもPython

Pythonで世界を包みたい

Pythonで正規表現(re)を使いたい(3)

ここでは正規表現(1),(2)に続いて
その他の便利機能について整理します。

コンパイル

今まではre.match("正規表現","対象文字列")と直接、正規表現を渡していました。
しかし、ループなど繰り返しの中でこれを使うと処理量が増えて速度を低下させます。

正規表現パターンをコンパイルしておくことで、この処理を削減することが可能になります。

import re

reg = re.compile("aba")

text = [対象の文字列群]

for t in text:
    rtn = reg.match(t)
    if rtn:
        rtn.start()

コンパイルした正規表現でも、match,search,findall,split等が使用可能です。

イテレータ

findallはマッチするものを全て返してくれて便利ですが、
リストの中身が膨大になる場合は非効率です。
finditerを使用し、イテレーターにすることで、
メモリの圧迫を防ぐことが可能です。

for res in re.finditer("正規表現","大きい文字列"):
    print res

sub

subはパターンにマッチしたものを置き換えます。
countで何個までを置き換えるかを決定できます。
(0または省略した場合は全て)

re.sub("ab","c","ababaaab",count = 0)
#ccaac

re.sub("ab","c","ababaaab",count = 1)
#cabaaab

subは置き換え文字のところに関数を渡すことが可能です。
これを用いることで、正規表現のみでは解決できない、
複雑な置き換えが可能になります。

def compress(matchobj):
    num = len(matchobj.group())
    return str(num) + "a"

re.sub("a+",compress,"ababaaab")
# 1ab1ab3ab