Traffine I/O

日本語

2023-03-10

Pythonのreモジュールによる正規表現

reモジュール

Pythonの組み込みライブラリであるreライブラリは、正規表現をサポートするモジュールです。正規表現は、検索パターンを定義する文字のシーケンスのことで、regexまたはregexpとも呼ばれます。reモジュールを使用すると、文字列内のパターンを検索して、一致、置換、分割などのさまざまな操作を実行できます。

reモジュールには、正規表現を扱うためのさまざまな関数やメソッドが提供されており、compile()search()match()fullmatch()findall()finditer()sub()split()escape()group()groups()などが含まれます。これらのメソッドを使用すると、正規表現をコンパイルしたり、パターンを検索したり、サブストリングを置換したり、文字列を分割したりなど、文字列と正規表現を操作できます。

reモジュールを使用すると、ログファイルの解析、ユーザー入力の検証など、複雑なテキスト処理タスクを実行できます。正規表現は学習が難しく、効果的に使用することが難しい場合がありますが、テキストデータを扱うための強力なツールです。

以下は、文字列内のパターンを検索するためにreモジュールを使用する例です。

python
import re

text = "The quick brown fox jumps over the lazy dog"
pattern = r"fox"

result = re.search(pattern, text)

if result:
    print("Match found:", result.group())
else:
    print("No match found.")

この例では、reモジュールをインポートして、textという文字列変数を定義します。また、単語「fox」に一致する正規表現パターンを定義します。その後、re.search()メソッドを使用して、text変数内でパターンを検索します。一致が見つかった場合、group()メソッドを使用して一致した部分文字列を表示します。一致が見つからなかった場合は、一致が見つからなかったことを示すメッセージを表示します。

メソッド

Pythonのreモジュールには、正規表現を扱うためのいくつかのメソッドが用意されています。この記事では、それらのメソッドについて説明し、それぞれの使用例と出力を紹介します。

re.compile()

re.compile()メソッドは、正規表現パターンを正規表現オブジェクトにコンパイルし、パターンマッチングに使用するためのものです。以下は例です。

python
import re

pattern = re.compile(r'\d+')
result = pattern.findall('There are 123 apples and 456 oranges')
print(result)
['123', '456']

この例では、re.compile()を使って正規表現パターン\d+を正規表現オブジェクトにコンパイルしました。そして、このオブジェクトのfindall()メソッドを使用して、与えられた文字列中の1つ以上の数字の全ての出現を検索しました。

re.search()

re.search()メソッドは、文字列内の正規表現パターンの最初の出現を検索します。以下は例です。

python
import re

result = re.search(r'\d+', 'There are 123 apples and 456 oranges')
print(result.group())
123

この例では、与えられた文字列内で1つ以上の数字の最初の出現を検索するために、re.search()を使用しています。そして、結果のマッチオブジェクトのgroup()メソッドを使用して、マッチした文字列を取得しています。

re.match()

re.match()メソッドは、re.search()と似ていますが、文字列の先頭でしか検索しません。以下は例です。

python
import re

result = re.match(r'\d+', '123 apples and 456 oranges')
print(result.group())
123

この例では、与えられた文字列の先頭で1つ以上の数字の最初の出現を検索するために、re.match()を使用しています。

re.fullmatch()

re.fullmatch()メソッドは、re.match()と似ていますが、先頭だけでなく文字列全体にマッチします。以下は例です。

python
import re

result = re.fullmatch(r'\d+', '123')
print(result.group())
123

この例では、re.fullmatch()を使用して、文字列全体が正規表現パターン\d+にマッチするようにしています。

re.findall()

re.findall()メソッドは、文字列内の正規表現パターンに一致する全ての重複しない部分文字列のリストを返します。以下に例を示します。

python
import re

result = re.findall(r'\d+', 'There are 123 apples and 456 oranges')
print(result)
['123', '456']

この例では、re.findall()を使用して、与えられた文字列内の1つ以上の数字の全ての出現箇所を検索しています。

re.finditer()

re.finditer()メソッドは、文字列内の正規表現パターンに一致する全ての重複しない部分文字列のマッチオブジェクトを生成するイテレータを返します。以下に例を示します。

python
import re

for match in re.finditer(r'\d+', 'There are 123 apples and 456 oranges'):
    print(match.group())
123
456

この例では、re.finditer()を使用して、与えられた文字列内の1つ以上の数字の全ての出現箇所を検索しています。その後、結果のイテレータをループ処理し、一致した文字列を出力しています。

re.sub()

re.sub()メソッドは、文字列内のパターンを置換文字列で置き換えます。re.sub()の構文は以下のようになります。

python
re.sub(pattern, repl, string, count=0, flags=0)
  • pattern: 検索する正規表現パターン
  • repl: 置換する文字列
  • string: 検索する文字列
  • count (オプション): 置換する最大数(デフォルトは0で、全ての出現箇所を置換します)
  • flags (オプション): 正規表現フラグ

以下に、文字列内の全ての "world" の出現箇所を "python" で置き換える例を示します。

python
import re

string = "hello world, welcome to the world of python"
new_string = re.sub("world", "python", string)

print(new_string)
hello python, welcome to the python of python

re.split()

re.split()メソッドは、正規表現パターンを区切り文字列として使用して、文字列をサブストリングのリストに分割するために使用されます。re.split()の構文は次のとおりです。

python
re.split(pattern, string, maxsplit=0, flags=0)
  • pattern: 区切り文字列として使用する正規表現パターン
  • string: 分割する文字列
  • maxsplit (オプション): 実行する最大分割数(デフォルトは0で、全ての出現を分割します)
  • flags (オプション): 正規表現フラグ

以下は、1つ以上のスペースにマッチする正規表現パターンを使用して、文字列を分割する例です。

python
import re

string = "hello   world  of  python"
new_list = re.split("\s+", string)

print(new_list)
['hello', 'world', 'of', 'python']

re.escape()

re.escape()メソッドは、文字列内の特殊文字をエスケープして、正規表現パターン内のリテラル文字として使用できるようにするために使用されます。 re.escape()の構文は次のとおりです。

python
re.escape(string)
  • string: エスケープする文字列

以下は、文字列内の特殊文字をエスケープするためにre.escape()を使用する例です。

import re

string = "hello (world)"
escaped_string = re.escape(string)

print(escaped_string)
hello\ \(world\)

re.group()

re.group()メソッドは、正規表現パターン内の特定のグループに一致する部分文字列を取得するために使用されます。re.group()の構文は次のとおりです。

python
re.group([group1, ...])
  • group1, group2, ... (optional): the group numbers to retrieve

以下は、re.group()を使用して特定のグループに一致する部分文字列を取得する例です。

python
import re

string = "hello world"
pattern = r"(\w+)\s(\w+)"
match = re.search(pattern, string)

print(match.group(1))
hello

re.groups()

re.groups()メソッドは、正規表現パターン内のキャプチャされたグループ全てを含むタプルを返します。グループは、パターン内でかっこで定義されます。グループが一致しない場合は、空のタプルが返されます。

以下は例です。

python
import re

pattern = r'(\d{3})-(\d{2})-(\d{4})'
string = 'My SSN is 123-45-6789.'

match = re.search(pattern, string)

if match:
    groups = match.groups()
    print(groups)
('123', '45', '6789')

この例では、xxx-xx-xxxx形式の社会保障番号 (SSN) にマッチする正規表現パターンを定義します。re.search()メソッドを使用して、このパターンを指定された文字列内で検索します。一致が見つかった場合、結果のマッチオブジェクトに対してgroups()メソッドを呼び出して、パターンでキャプチャされた全てのグループを抽出します。得られたタプルには、SSNを構成する三つの数字グループが含まれています。

参考

https://docs.python.org/3/library/re.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!