文字列から条件に合う文字列を抽出する
インポートとサンプル文字列
import re
text = '[りんご][ゴリラ][ラッパ][パンツ]'
findall()
は全ての一致部分をリストで返す。
# そのまま抽出する
print(re.findall('\[(.*?)\]', text))
# コンパイルしてから抽出する。結果は同じ。
p = re.compile('\[(.*?)\]') #抽出指定:開始[ 終了] 非貪欲マッチ*?
print(p.findall(text))
['りんご', 'ゴリラ', 'ラッパ', 'パンツ']
search()
match()
fullmatch()
はマッチオブジェクトを返す。
-
search()
では、マッチする部分が複数ある場合、最初のマッチ部分のみを返す。 -
match()
が調べるのは先頭のみ。先頭にマッチする文字列がない場合はNoneを返す。 -
fullmatch()
は、文字列全体が正規表現パターンにマッチしているかどうかの確認。
#以下では、上で作成した正規表現パターンオブジェクトを用いている。
p.search(text)
# <re.Match object; span=(0, 5), match='[りんご]'>
p.match(text)
# <re.Match object; span=(0, 5), match='[りんご]'>
p.fullmatch(text)
# <re.Match object; span=(0, 20), match='[りんご][ゴリラ][ラッパ][パンツ]'>
finditer()
は全ての一致部分をイテレータで返す。
- 要素はマッチオブジェクトなので、マッチした部分の位置なども取得できる。
p.finditer(text)
# <callable_iterator at 0x7a0995962710>
list(p.finditer(text))
# [<re.Match object; span=(0, 5), match='[りんご]'>,
# <re.Match object; span=(5, 10), match='[ゴリラ]'>,
# <re.Match object; span=(10, 15), match='[ラッパ]'>,
# <re.Match object; span=(15, 20), match='[パンツ]'>]
for m in p.finditer(text):
print(m)
# <re.Match object; span=(0, 5), match='[りんご]'>
# <re.Match object; span=(5, 10), match='[ゴリラ]'>
# <re.Match object; span=(10, 15), match='[ラッパ]'>
# <re.Match object; span=(15, 20), match='[パンツ]'>