hakeの日記

Windows環境でプログラミングの勉強をしています。

python - 正規表現

reモジュールのメソッドを使用する場合。

import re

# クラスメソッド
#
#
# 文字列中にヒットする部分があるかを評価する
m = re.search(r'[a-z]', '1a2b3c')
print(m.group())        # a
print(type(m))          # <class '_sre.SRE_Match'>
print(m)                # <_sre.SRE_Match object; span=(1, 2), match='a'>
print(m.group(0))       # a
print(m.start(0))       # 1 開始index
print(m.end(0))         # 2 終了index + 1
print(m.span(0))        # (1, 2)

# ヒットしない場合
m = re.search(r'\W', '1a2b3c')
print(m)                # None

# キャプチャ
m = re.search(r'(\d)([a-z])', '1a2b3c')
print(m.group(0))       # 1a
print(m.group(1))       # 1
print(m.group(2))       # a
print(str(m.lastindex)) # 2  キャプチャしたグループ数


# オプション
m = re.search(r'A', '1a2b3c', re.IGNORECASE)
print(m.group(0))       # a

# 文字列先頭からヒットする評価する
m = re.match(r'[a-z]', '1a2b3c')
print(m)                # None
m = re.match(r'\w', '1a2b3c')
print(m.group(0))       # 1

m = re.match(r'(\d)([a-z])', '1a2b3c')
print(m.groups())       # ('1', 'a') キャプチャのtuple


# 文字列全体がマッチするか評価する
m = re.fullmatch(r'\w', '1a2b3c')
print(m)                # None
m = re.fullmatch(r'\w+', '1a2b3c')
print(m.group(0))       # 1a2b3c

# 分割
m = re.split(r'\d', '1a2b3c')
print(m)                # ['', 'a', 'b', 'c']

# 文字列中のマッチする文字列を全て検索
m = re.findall(r'\d[a-z]', '1a2b3c')
print(m)                # ['1a', '2b', '3c']
print(len(m))           # 3
print(m[0])             # 1a
#   キャプチャがある場合はtupleのリストになる
m = re.findall(r'(\d)([a-z])', '1a2b3c')
                        # ヒットした文字列全体は返さないので注意
print(m)                # [('1', 'a'),
                        #  ('2', 'b'),
                        #  ('3', 'c')]
# イテレータを返す
for e in re.finditer(r'(\d)([a-z])', '1a2b3c'):
    print(e.group(0))   #  1a  2b  3c
    print(e.group(1))   #   1   2   3
    print(e.group(2))   #   a   b   c

# 文字列置換
m = re.sub(r'(\d)([a-z])', r'\2\1', '1a2b3c')
print(m)                # a1b2c3

# 文字列置換(置換文字に関数を使用)
def my_repl(m):
    return "@"+m.group(0)+"@"
m = re.sub(r'(\d)([a-z])', my_repl, '1a2b3c')
print(m)                # @1a@@2b@@3c@

# 文字列置換(返還後文字と置換数をtupleで返す)
m = re.subn(r'(\d)([a-z])', r'\2\1', '1a2b3c')
print(m)                # ('a1b2c3', 3)

# 英数字と'_'以外をエスケープ
m = re.escape(r'_abc./*+')
print(m)                # _abc\.\/\*\+

正規表現コンパイルして正規表現オブジェクトを利用する場合。

# インスタンスメソッド
#
#
# 文字列中にヒットする部分があるかを評価する
p = re.compile(r'[a-z]')
print(p.pattern)        # [a-z]
m = p.search('1a2b3c')
print(m.group())        # a
print(type(m))          # <class '_sre.SRE_Match'>
print(m)                # <_sre.SRE_Match object; span=(1, 2), match='a'>
print(m.group(0))       # a
print(m.start(0))       # 1 開始index
print(m.end(0))         # 2 終了index + 1
print(m.span(0))        # (1, 2)
#   検索開始位置指定
m = p.search('1a2b3c', 2)
print(m.group())        # b

# ヒットしない場合
p = re.compile(r'\W')
m = p.search('1a2b3c')
print(m)                # None

# キャプチャ
p = re.compile(r'(\d)([a-z])')
print(p.groups)         # 2 キャプチャグループ(0 - 2)
m = p.search('1a2b3c')
print(m.group(0))       # 1a
print(m.group(1))       # 1
print(m.group(2))       # a
print(str(m.lastindex)) # 2  キャプチャしたグループ数


# オプション
p = re.compile(r'A', re.IGNORECASE)
m = p.search('1a2b3c')
print(m.group(0))       # a


# 文字列先頭からヒットする評価する
p = re.compile(r'([a-z])')
m = p.match('1a2b3c')
print(m)                # None
m = p.match('1a2b3c', 1) #開始位置指定
print(m.group(0))       # a

p = re.compile(r'(\d)([a-z])')
m = p.match('1a2b3c')
print(m.groups())       # ('1', 'a') キャプチャのtuple


# 文字列全体がマッチするか評価する
p = re.compile(r'\w')
m = p.fullmatch('1a2b3c')
print(m)                # None
p = re.compile(r'\w+')
m = p.fullmatch('1a2b3c', 2, 5) # 開始終了位置指定
print(m.group(0))       # 2b3

# 分割
p = re.compile(r'\d')
m = p.split('1a2b3c')
print(m)                # ['', 'a', 'b', 'c']
m = p.split('1a2b3c', 2) # 最大分割数指定
print(m)                # ['', 'a', 'b3c']



# 文字列中のマッチする文字列を全て検索
p = re.compile(r'\d[a-z]')
m = p.findall('1a2b3c')
print(m)                # ['1a', '2b', '3c']
print(len(m))           # 3
print(m[0])             # 1a
#   キャプチャがある場合はtupleのリストになる
p = re.compile(r'(\d)([a-z])')
m = p.findall('1a2b3c') # ヒットした文字列全体は返さないので注意
print(m)                # [('1', 'a'),
                        #  ('2', 'b'),
                        #  ('3', 'c')]

# イテレータを返す
p = re.compile(r'(\d)([a-z])')
for e in p.finditer('1a2b3c'):
    print(e.group(0))   #  1a  2b  3c
    print(e.group(1))   #   1   2   3
    print(e.group(2))   #   a   b   c

# 文字列置換
p = re.compile(r'(\d)([a-z])')
m = p.sub(r'\2\1', '1a2b3c')
print(m)                # a1b2c3
m = p.sub(r'\2\1', '1a2b3c', 2) # 回数指定
print(m)                # a1b23c

# 文字列置換(置換文字に関数を使用)
def my_repl(m):
    return "@"+m.group(0)+"@"
p = re.compile(r'(\d)([a-z])')
m = p.sub(my_repl, '1a2b3c')
print(m)                # @1a@@2b@@3c@

# 文字列置換(返還後文字と置換数をtupleで返す)
p = re.compile(r'(\d)([a-z])')
m = p.subn(r'\2\1', '1a2b3c', 2) # 開始位置指定
print(m)                # ('a1b2c3', 2)