Traffine I/O

日本語

2023-02-24

正規表現(Regex)のガイド

正規表現 (Regex) とは

正規表現(Regex)は、テキストパターンのマッチング、検索、操作に使用される強力なツールです。これは、検索パターンを定義する文字列のシーケンスであり、テキスト内の特定の文字、単語、またはパターンを検索して置換することができます。

Regexは、プログラミング、Web開発、データ分析などで広く使用されており、テキスト処理タスクを効率化することができます。Regexを使用することで、繰り返しのテキスト操作を自動化し、簡単に複雑な検索と置換操作を実行することができます。

正規表現の利点

正規表現は以下の利点があります。

  • 効率の向上
    Regexを使用すると、テキストパターンを素早く正確に検索して置換することができ、テキスト操作に必要な時間と労力を削減することができます。

  • 高い精度
    特定のパターンを定義することで、意図したテキストのみがマッチングされ、エラーの可能性が減少します。

  • 柔軟性
    Regexは、文字、数字、記号、空白など、様々なパターンにマッチングすることができ、テキスト処理タスクに対して汎用的なツールとなります。

正規表現の一般的な応用例

正規表現は以下のような応用例があります。

  • データ抽出と解析
    Regexは、名前、日付、電話番号、メールアドレスなどの大量のデータから特定の情報を抽出するためによく使用されます。

  • テキストの検証とフォーマット
    Regexを使用して、ユーザーのメールアドレスが有効であることや、電話番号がまさしくフォーマットされていることなど、テキスト入力の検証とフォーマットを行うことができます。

  • 検索と置換
    Regexを使用して、テキスト内の特定のパターンを検索し、新しいパターンに置換することができます。このため、コードのリファクタリングやコンテンツ編集などのタスクに役立ちます。

正規表現の構文

Regexの基本的な構文とパターン、量指定子と代替の使用について説明します。

基本的な構文とパターン

Regexでもっとも基本的な構文は、テキスト内のその文字を完全にマッチングする単一の文字です。例えば、パターン "a" はテキスト内の文字 "a" にマッチします。ただし、Regexには、以下のようなより複雑なパターンが可能です。

  • 文字クラス
    [a-z]は、"a" から "z" の間の任意の小文字にマッチします。

  • メタ文字
    \dは任意の数字にマッチし、\wは任意の英数字文字にマッチし、\sは任意の空白文字にマッチします。

  • アンカー
    ^は行の先頭にマッチし、$は行の末尾にマッチします。

量指定子

量指定子を使用すると、テキスト内の文字やパターンが何回マッチするかを指定できます。もっとも一般的な量指定子は次のとおりです。

  • *:前の文字やパターンが0回以上マッチすることを示します。
  • +:前の文字やパターンが1回以上マッチすることを示します。
  • ?:前の文字やパターンが0回または1回マッチすることを示します。

例えば、パターンab*cは、「ac」「abc」「abbc」「abbbc」などにマッチします。

代替

代替を使用すると、いくつかのオプションのいずれか1つにマッチングできます。代替の構文は縦棒文字 "|" です。例えば、パターン "cat|dog" は、テキスト内の "cat" または "dog" のいずれかにマッチします。

特殊文字とクラス

正規表現(Regex)は、テキストデータ内の特定の文字パターンにマッチするために、特殊文字や特殊文字クラスを使用します。

特殊文字

正規表現(Regex)は、テキストデータ内の特定のパターンにマッチするために、様々な特殊文字を使用します。以下は、正規表現で一般的に使用される特殊文字のリストです。

  • . : 改行以外の任意の1文字にマッチ
  • * : 直前の文字やグループの0回以上の出現にマッチ
  • + : 直前の文字やグループの1回以上の出現にマッチ
  • ? : 直前の文字やグループの0回または1回の出現にマッチ
  • ^ : 文字列の先頭にマッチ
  • $ : 文字列の末尾にマッチ
  • [ ] : 括弧内の任意の1文字にマッチ
  • [^ ] : 括弧内の文字以外の任意の1文字にマッチ
  • | : 左側または右側の式のいずれかにマッチ
  • () : キャプチャグループを作成

以下は、これらの特殊文字が正規表現でどのように使用されるかの例です。

  • パターンa.bは、aで始まりbで終わる3文字の文字列にマッチします。例えばacbaabなどです。
  • パターンab*cは、aで始まりcで終わり、その間に文字bが0個以上含まれる文字列にマッチします。例えばacabcabbbcなどです。
  • パターンab+cは、aで始まりcで終わり、その間に文字bが1個以上含まれる文字列にマッチします。例えばabcabbbcなどです。
  • パターンcolou?rは、u文字がオプションであるため、 colorまたはcolourにマッチします。
  • パターン^[A-Z]は、大文字で始まる文字列にマッチします。
  • パターン@[a-z]+\.[a-z]{2,3}$は、username@domain.comまたはusername@domain.co.ukの形式の電子メールアドレスにマッチします。

特殊クラス

正規表現(Regex)では、特殊な文字クラスを使用して、テキストデータ内の特定の種類の文字にマッチさせます。以下は、正規表現で一般的に使用される特殊な文字クラスのリストです。

  • \d:数字文字(0-9)にマッチします。
  • \D:数字以外の文字にマッチします。
  • \w:単語文字(a-z、A-Z、0-9、_)にマッチします。
  • \W:単語文字以外にマッチします。
  • \s:空白文字(スペース、タブ、改行)にマッチします。
  • \S:空白文字以外にマッチします。
  • .:改行以外の任意の文字にマッチします。
  • [ ]:括弧内に含まれる任意の一文字にマッチします。
  • [^ ]:括弧内に含まれない任意の一文字にマッチします。

以下は、これらの特殊文字クラスが正規表現(Regex)でどのように使用されるかの例です。

  • パターン\d{3}-\d{2}-\d{4}は、社会保障番号の形式に従う任意の文字列(例:123-45-6789)に一致します。
  • パターン\b\w{5}\bは、テキスト文字列内の任意の5文字の単語(例:appleやbanana)に一致します。
  • パターン\s\d{3}\sは、空白文字、3桁の数字、別の空白文字が続く任意の文字列(例:123または456)に一致します。
  • パターン[^aeiou]は、母音でない任意の1文字に一致します。

グループ化とキャプチャ

正規表現では、グループ化とキャプチャもサポートされています。この記事では、グループ化とキャプチャが何であるか、および正規表現でどのように使用できるかについて説明します。

  • グループ化
    正規表現におけるグループ化とは、文字列のグループを単一の単位として扱い、量指定子、交互選択、または繰り返し処理ができるようにすることです。Regexでグループを作成するには、グループを括弧で囲みます。例えば、パターン(ab)+は、テキスト内の "ab" の1回以上の出現に一致します。

  • キャプチャ
    正規表現におけるキャプチャとは、一致したテキストの特定の部分を抽出して、さらなる処理や分析に使用できるようにすることです。Regexでキャプチャグループを作成するには、グループを括弧で囲み、グループ内の一致したテキストは後でバックリファレンスを使用して参照できます。例えば、パターン([a-z]+)@\w+.\w+は、テキスト内の電子メールアドレスに一致し、電子メールアドレスのユーザー名部分をキャプチャしてさらなる処理に使用します。

グループ化とキャプチャを正規表現で使用することで、より複雑で特定のパターンを作成し、一致したテキストの特定の部分をさらに処理または分析することができます。キャプチャとグループを使用することで、より高度なパターンを作成し、より精密で正確にテキストを一致させたり操作したりすることができます。

プログラミング言語で正規表現を使用する

PythonとJavaScriptは、正規表現をネイティブでサポートする人気のあるプログラミング言語です。この記事では、PythonとJavaScriptで正規表現を使用する方法について説明します。

Python

Pythonは、reモジュールを通じて正規表現を組み込みでサポートしています。Pythonで正規表現を使用する基本的な構文は次のとおりです。

python
import re

# define a pattern
pattern = r'some_regex_pattern'

# search for the pattern in a string
match = re.search(pattern, some_text)

# check if the pattern was found
if match:
  # do something with the match
else:
  # handle the case where the pattern was not found

この例では、reモジュールをインポートして正規表現のパターンを定義しています。その後、 re.search()メソッドを使用して、与えられた文字列内のパターンを検索します。パターンが見つかった場合は、一致したテキストを処理することができます。パターンが見つからなかった場合は、それに対応する処理を行うことができます。

JavaScript

JavaScriptでも、RegExpオブジェクトを通じて正規表現を組み込みでサポートしています。JavaScriptで正規表現を使用する基本的な構文は次のようになります。

javascript
// define a pattern
var pattern = /some_regex_pattern/;

// search for the pattern in a string
var match = some_text.match(pattern);

// check if the pattern was found
if (match !== null) {
  // do something with the match
} else {
  // handle the case where the pattern was not found
}

この例では、/regex_pattern/構文を使用して正規表現パターンを定義し、文字列オブジェクトのmatch()メソッドを使用して、指定された文字列内でパターンを検索します。パターンが見つかった場合は、マッチしたものを処理します。パターンが見つからなかった場合は、それに応じて処理します。

正規表現の現実世界での使用例

正規表現は、テキストのマッチングや操作に広範囲に適用できるため、現実世界の様々なシナリオに応用できます。以下は、正規表現が電子メールのバリデーションや電話番号のフォーマット変換にどのように使用されるかの例です。

電子メールのバリデーション

正規表現を使用して、電子メールアドレスがまさしくフォーマットされているかどうかを検証できます。以下は、Pythonで電子メールアドレスを検証するために使用できる正規表現の例です:

python
import re

email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

def validate_email(email):
    return re.match(email_pattern, email) is not None

このパターンにより、電子メールアドレスが1つ以上の文字、数字、または特殊文字で始まり、@ 記号、1つ以上の文字、数字、またはハイフン、ピリオド、2文字以上で構成されていることが保証されます。

電話番号のフォーマット

Regexを使用して、電話番号を一貫してフォーマットできます。ここでは、JavaScriptで米国の電話番号をハイフン区切りでフォーマットするために使用できるRegexパターンの例を示します。

javascript
function format_phone_number(phone_number) {
    const cleaned = ('' + phone_number).replace(/\D/g, '');
    const match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/);
    if (match) {
        return match[1] + '-' + match[2] + '-' + match[3];
    }
    return phone_number;
}

このパターンは、電話番号から非数値文字を全て削除し、xxx-xxx-xxxxの標準的な米国の電話番号形式でハイフンでフォーマットします。

データ抽出と解析

Regexは、テキスト文字列またはファイルから特定のデータを抽出するために使用できます。ここでは、Pythonでテキストファイルから電子メールアドレスを抽出するために使用できるregexパターンの例を示します。

python
import re

email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'

with open('textfile.txt') as f:
    for line in f:
        emails = re.findall(email_pattern, line)
        for email in emails:
            print(email)

このパターンは、電子メールアドレスの形式に一致する文字列を検索し、テキストファイルからそれらを抽出します。re.findall()メソッドは、テキストファイルで見つかった全ての一致項目のリストを返します。

テキストの検索と置換

Regexは、特定のテキストパターンを他のテキストパターンで置き換えるためにも使用できます。ここでは、JavaScriptでテキストファイル内の全ての「color」の出現箇所を「colour」に置換するために使用できるregexパターンの例を示します:

javascript
const fs = require('fs');

fs.readFile('textfile.txt', 'utf8', function(err, data) {
    if (err) throw err;
    const result = data.replace(/color/g, 'colour');
    fs.writeFile('textfile.txt', result, 'utf8', function(err) {
        if (err) throw err;
    });
});

このパターンは、テキストファイル内の全ての「color」の出現箇所をreplace()メソッドを使用して「colour」に置き換えます。

UUID

UUID(Universally Unique Identifier)は、コンピューターシステム内のリソースを識別するために一般的に使用される128ビットのユニークな識別子です。典型的なUUIDは次のようになります。

a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

次に示す正規表現(Regex)の例を使用すると、UUID文字列を一致させて検証できます。

^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$

これを分解すると、Regexパターンは次のようになります。

  • ^ : 文字列の先頭に一致します。
  • [0-9a-fA-F] : 任意の16進数桁の文字に一致します。
  • {8} : 前の文字またはグループの正確に8回の出現に一致します。
  • \- : ハイフン(-)文字に一致します。
  • $ : 文字列の末尾に一致します。

このRegexパターンを使用することで、与えられた文字列が有効なUUIDであるかどうかを検証できます。このパターンは、UUIDがハイフンを使用してUUIDの異なるセグメントを分離する標準的な形式であると想定しています。UUIDが全て小文字または全て大文字など、異なる形式の場合は、パターンを適宜変更する必要があります。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!