1. 概要

このチュートリアルでは、正規表現の背後にある基本的な概念とそのアプリケーションについて学習します。

まず、正規表現で使用される構文を説明し、複雑さが増す式を作成する方法をコンテキストで学習します。

次に、実際のタスクを解決するための正規表現の使用法に関するガイド付きの演習をいくつか見ていきます。 したがって、正規表現で問題を解決できるように問題を形式化するために、問題を推論する方法を学習します。

このチュートリアルの最後に、文字列の解析とパターンマッチングに関連する実際的な問題を解決するための正規表現を作成する方法を説明します。

2. 正規表現の紹介ノート

正規表現(短縮形:RegEx、複数形RegExes)は、文字列で検索している1つ以上の文字シーケンスを識別する式です。 その背後にある考え方は、内容が少なくとも部分的に不明なテキストに直面した場合、任意の条件を満たす部分を抽出できるようにすることです。

正規表現の使用は、自然言語処理のあらゆる種類のタスクで一般的です。 これには、パターンマッチング自体だけでなく、トークン化ステミングと字句解析単語と文の解析文字列置換[ X180X]、およびドキュメントと情報の取得

RegExesの使用法は非常に一般的であるため、 Kotlin Java Scala Groovy 、およびAWKであり、言語固有の実装は、当社のWebサイトの関連するチュートリアルで見つけることができます。

3. 正規表現の構文

3.1. シングルキャラクター

記法について深く説明する前に、記法について簡単に説明します。 この記事では、文字列を操作する正規表現で示します。 onの適用、いわゆるパターンマッチングは、言語に依存しないようにするために、で示します。 また、変数を散発的に使用して、メインの正規表現と比較する代替正規表現を示します。

最も単純な正規表現は、文字列内の特定の1文字のすべてのインスタンスを検索する正規表現です。 文字列「aaAbbBccC」内の文字「A」のすべての出現を探しているとしましょう。 このタスクを実行するために使用する正規表現は、「A」、「A」など、求められている文字に対応しています。

正規表現「a」のように、2回以上繰り返される文字を検索する場合、同じ検索では通常、複数の値[“a”、”a”]が返されることに注意してください。

3.2. 文字のグループと角かっこ

ここで、「aa」のように、文字「a」を含む文字のすべてのグループを2回検索するとします。 この場合、正規表現「aa」は2つの文字の組み合わせを返しますが、同じ文字の2つの孤立したインスタンス「aa」[「a」、「a」]は返しません。

ただし、大文字と小文字を区別せずに、文字「a」を2回繰り返したすべてのグループを検索することもできます。 これは、文字列に「a」と「A」のいずれかが含まれる場合は常に、これらのいずれかが回答として受け入れられることを意味します。 この場合、角かっこを含む正規表現を作成できます。その中に、2つの可能な代替文字を示します。

「[aA]」「aaAbbBccC」[「a」、「a」、「A」]

最後に、小文字の「a」で始まり、その後に別の小文字の「a」または大文字の「A」が続く場合は常に、文字のグループのみに関心があることを指定できます。 これは、次の正規表現の指定に対応します。

「a[aA]」「aabaA」[「aa」、「aA」]

最初の小文字の「a」が角かっこの外側にあり、「a」と「A」の2つの代替ケースを角かっこの内側に挿入したことに注目してください。 また、同じ正規表現が「Aa」という形式の文字列を検出しないことにも注意してください。最初の文字は大文字です。

「a[aA]」「Aa」

文字列「Aa」でグループ「Aa」を見つけるには、正規表現の用語の順序を逆にする必要があります。

「[aA]a」「Aa」「Aa」

3.3. 文字の範囲

明示的なリストではなく、角かっこを使用して文字の範囲を示すこともできます。 たとえば、文字列「aaAbbBccC」で大文字のインスタンスを検索する場合は、次の正規表現を定義できます。

「[ABC]」[「A」、「B」、「C」]

ただし、演算子「-」を使用して同じ式を書き換えることができます。 ハイフンは、前後に別の文字がある場合、これら2つの極値の間に含まれるすべての文字を示します。

「[AC]」[「A」、「B」、「C」]

同様に、英語のアルファベットのすべての大文字に一致する正規表現「[AZ]」を示すことができます。 正規表現「[az]」も同様にすべての小文字に一致します。これは、「[AZ]」「[az]」がアルファベットのすべての文字に一致することを意味します。 この式は、RegEx形式で次のように記述できます。

「[a-zA-Z]」「aaAbbBccC」[「a」、「a」、「A」、「b」、「b」、「B」、「c」、「c」、「C」]

すべての英数字に一致する式は、次のように、前の式に範囲「[0-9]」を追加することで作成できます。

「[a-zA-Z0-9]」「abcABC123」[「a」、「b」、「c」、「A」、「B」、「C」、「1」、「2」、「3」 ]

3.4. いくつかの特殊文字:単語と数字

また、すべての文字を含む範囲を示すショートカットを使用することもできます。これには、句読点、通貨の記号、および間もなく表示されるその他すべての文字が追加されたすべての英数字が含まれます。 このショートカットは、角かっこなしで書かれた単一のドット「。」です。

「。」 「aAbB12-?」 [「a」、「A」、「b」、「B」、「1」、「2」、「-」、「?」]

これは少し単純化したものであり、実際には、ドットがすべての文字と一致するとは限らないことに注意してください。 特に、一部のプログラミング言語では、改行文字「\n」が正規表現「。」によってスキップされることがよくあります。 文字通りのドット「。」を参照したい場合。 代わりに、「\。」のように、正規表現のドットの前に円記号を付けることができます。

その他の特殊文字には、すべての英数字とアンダースコアに一致する「\w」が含まれます。

「a_B1?」 “ \ w”“ [a-zA-Z0-9_]” [“ a”、“ _”、“ B”、“ 1”]

その補足である「\W」は、英数字またはアンダースコアではないすべての文字に一致します。

「\w」「a_B1?」 「?」

同様に、正規表現「\d」を使用してすべての数字を照合できます。

「\d」「a_B1?」 「1」

その補足「\D」は、代わりにすべての数字以外の文字と一致します。

「\d」「a_B1?」 [「a」、「_」、「B」、「?]

3.5. 空の文字列と空白

単語に関連して、式「\w」と一致する英数字またはアンダースコアの直前または直後のすべての空の文字列に一致する正規表現「\b」を使用することもできます。 この正規表現は通常、完全な単語を検索するコンテキストで使用されますが、文字列が単語のサブセットとして出現する場合には関心がありません。

テキスト内の「船」という単語のインスタンスを検索しているが、「旗艦」などの複合語は避けたいとします。 次に、「\b」パターンを囲む「ship」という単語を含む正規表現を使用できます。

「\bship\b」「旗艦」「船」「船」

単語を操作する際のもう1つの重要なパターンは、「\s」で示される空白スペースの正規表現です。 このパターンは、空白」「だけでなく、タブ「\ t」、改行「\ n」、およびキャリッジリターン「\r」にも一致します。 以前の場合と同様に、その補足「\ S」は、空白ではないすべての文字に一致します。

3.6. 量指定子

同じ文字または文字のグループの複数の繰り返しを示す量指定子に移動できるようになりました。 すべての量指定子は、それらが参照する文字またはグループのすぐ右側に書き込む必要があります。

最も単純な数量詞は「?」です。これは、それに続く文字またはグループの「ゼロまたは1」の繰り返しを意味します。 たとえば、特定の「スミス」が男性か女性かわからない場合は、「Mr」と「Mrs」の両方に一致する正規表現を作成できます。

“夫人?” 「MrSmith」「Mr」「MrsSmith」「Mrs」

1つだけでなく、0個以上の文字の出現すべてに一致する数量詞を使用することもできます。 この数量詞はアスタリスク「*」です。これは、人間が興奮しているときに一部の文字を繰り返す傾向があるため、短いテキストメッセージを解析するときに非常に役立ちます。

「ni*ce」「nice」「nice」「niiice」「niiice」

ただし、このパターンは、文字が存在しない文字列にも一致することに注意してください。

「ni*ce」「nce」「nce」

この問題に対処するために、同じ文字の1つ以上の繰り返しのすべてのインスタンスに一致する数量詞「+」を使用できます。

「ni+ce」「nice」「nice」「nce」

3.7. 特定の間隔または繰り返し

必要な特定の繰り返し回数に対応する間隔を定義することもできます。 たとえば、ハイフンが前に付いた正確に3桁のすべての繰り返しを見つけることに関心があるかもしれません。 多くの国では、これは国内通話の都市プレフィックスを示しており、どの都市を呼び出しているかを知りたい場合があります。

これは、上で見た数字のパターン「\ d」の直後に式「{3}」を追加し、その後にハイフンを付けることによって行われます。

「\d{3}-」「555-12345」「555-」「55-12345」

ただし、都市の接頭辞が何桁あるかについても不明な場合があります。 この場合、この間隔の上限がわかっていれば、開区間または閉区間のいずれかを示すことができます。 正規表現の用語では、間隔を次のように表すことができます。

  • 「{n、m}」は、閉じた間隔を示します
  • 「{n、}」は、ハーフオープン間隔を示します

ハイフン(含まれている)に続く3〜8桁のすべてのグループをキャッチする正規表現は、たとえば次のとおりです。

「-\d{3,8}」「555-12345」「-12345」「55-123456789」「-12345678」

3.8. グループ

これまで見てきたことから、量指定子は個々の文字にのみ適用されています。 ただし、それらを文字のグループまたはシーケンスに適用することもできます。

RegEx構文では、グループは、丸括弧内に含まれる文字のシーケンスまたは式として定義されます。 たとえば、式「(abc)」は文字列「abc」全体に一致しますが、その部分文字列には一致しません。 ただし、文字列「abcabc」の2倍にも一致します。

たとえば、文字列「abcabc」内のパターン「abc」のすべての二重繰り返しに一致させたいが、一意のオカレンスには一致させたくない場合は、RegEx「abcabc」を記述するか、よりエレガントに次のように記述できます。

「(abc){2}」「abcabc」「abcabc」

括弧なしでRegExを記述した場合、数量詞「{2}」は文字「c」にのみ適用されることに注意してください。 これは、「abc{2}」が「abcc」と一致するが「abcabc」とは一致しないことを意味します。

「*」、「+」、「?」、「{n、m}」などの他の量指定子はすべて、角かっこで囲まれたグループに等しく適用できます。 このように使用すると、個々のキャラクターではなく、グループ全体で機能します。

3.9. ブール演算子OR

グループには代替式を含めることもできます。これは、同じ文字列のバリエーションが多数存在する場合に特に役立ちます。 たとえば、「灰色」の色は、話者の出所に応じて、2つの可能な方法で英語で綴られていることがわかっています。 テキストでその色を探している場合、「灰色」の形式の正規表現は「灰色」と一致しません。その逆も同様です。

ただし、グループとブール演算子またはを使用して、正規表現で「|」を使用して、代替を示すことができます。

「gr(a | e)y」「gray」「gray」「grey」「grey」

さまざまな要素を連続してアタッチすることにより、または句のより長いチェーンも可能です。

「0(1 | 2 | 3)」「010203」[「01」、「02」、「03」]

グループがRegExの唯一のコンポーネントである場合、その括弧は省略できます。 これは、同じ式に他の要素がない場合、正規表現「1 | 2 | 3」と「(1 | 2 | 3)」が完全に対応することを意味します。

3.10. 文字列の開始と終了

文字列の最初と最後の間に含まれるパターンを見つけることにも興味があるかもしれません。 この場合、キャレット「^」およびドル「$」記号を使用して、それぞれ行の開始文字と行の終了文字を示すことができます

機械学習タスクのCSVファイルを解析する必要があると想像してみてください。 前処理の一般的な手順の1つは、2つの「\n」内に含まれる文字列「0」の繰り返しに対応するすべてのnull観測値を除外することです。 これらすべてのパターンに一致する正規表現は次のとおりです。

“ ^(0、)* $”“ \ n0,0,0、\ n”“ 0,0,0、”

キャレット記号とドル記号を含めなかった場合、RegExは、次のように、行内のnull値のインスタンスにも一致することに注意してください。

“(0、)*”“ \ n0,1,0、\ n” [“ 0、”、“ 0、”]

3.11. 貪欲

ここで学習するRegEx構文の最後の側面は、貪欲さに対応しています。 貪欲の概念に入る前に、最も重要な注意点は次のとおりです。ここで使用する記号「?」は、上記の量指定子で見たものと同じですが、異なる役割を果たします。目的やルールが違うので注意してください。

貪欲とは、「?」、「+」、「*」などの量指定子が、繰り返しているパターンの可能な限り多くのインスタンスに一致することを意味します。 これは、選択肢が与えられた場合、常に可能な限り多くの文字の繰り返しを取ることを意味します。

「\d+」「555」「555」

ただし、パターンの繰り返しをできるだけ多くするのではなく、できるだけ少なくする方がよい場合があります。 この場合の解決策は、数量詞の後に追加の記号「?」を付けて、数量詞に貪欲でないことを指示することです。 したがって、量指定子「?」、「+」、および「*」の貪欲でないバージョンは、「??」、「+?」、「*?」です。

「\d+?」 「555」[「5」、「5」、「5」]

4. 正規表現の使用例

4.1. 最初の例:Mr.、Mrs。、およびMs.

正規表現の構文の学習が完了したので、実際のコンテキストで正規表現を適用する方法を確認できます。 このセクションでは、具体的なタスクを解決するための正規表現の実際の使用例を2つ紹介します

最初の例は、前に簡単に触れた例の拡張です。 男性のタイトルを識別し、女性のタイトルと区別する2つの正規表現を見つけたいと思います。 これは、それぞれ、文字列「Mr.」に一致するパターンに対応します。 しかし、「夫人」ではありません。 と「Ms.」、そして「Mrs.」と一致するパターン。 または「さん」 しかし、「ミスター」ではありません。

すべての場合において、最初の文字は大文字の「M」であり、最後の文字はピリオド「。」であることがわかっています。 これは、すべての正規表現が文字「M」で始まり、ドットのみに一致するパターンで終わることを意味します。 正規表現では、パターン「。」を覚えているからです。 文字「。」だけでなく、改行以外のすべての文字を示します。スラッシュ「\。」を前に付けるように注意する必要があります。 このように、ドットは文字通り意図されており、「任意の文字」のショートカットとしてではありません。

最初の正規表現は「Mr.」と一致する必要があります。 しかし、「夫人」ではありません。 または「さん」。 これは、正規表現「Mr\」を意味します。 仕事を完璧に行います。

2番目の正規表現は両方の「Mrs」と一致する必要があります。 または「Ms.」ですが、「Mr。」ではありません。 この正規表現は、前の正規表現よりも少し複雑です。 「Mrs\」を使用した場合。 「Ms\。」とは一致しません。その逆も同様です。

ただし、に必須の文字「r」がここではオプションであることに気付いた場合は、パターン「?」を使用できます。 その後、スキップできることを示します:「Mr?s\」。

4.2. 「ミス」も紹介したら?

女性向けのタイトルの中に、「Mrs」と一緒に「Miss」のタイトルも含めると、仕事が難しくなります。 と「さん」。 「ミス」がピリオドなしでどのように進むかに注意してください。したがって、「\」を作成する必要があります。 正規表現の最後に。 このように新しい正規表現を作成できます。

文字「M」は、前と同じように最初の位置に留まらなければなりません。 次に、代替オプションを探しています。

  • 最初の選択肢は、文字列「rs」に対応します。 または「s。」。
  • 2番目の選択肢は、文字列「iss」に対応します

これは、正規表現内にブール演算またはを適用する文字のグループがあることを意味します。 または操作を含むグループは「(r?s\。|iss)」のように見えるため、問題を解決する正規表現全体は次のようになります。

「M(r?s\。|iss)」

4.3. 2番目の例:有効な電子メールアドレスはどれですか?

私たちが研究する2番目の例は、構造化されていないテキストからの電子メールアドレスの抽出に関するものです。 これは、 HTML Webサイトの解析またはスクレイピングだけでなく、フォームのコンテンツの検証でも最も一般的なタスクの1つです。

ドキュメントが文字の長いコレクションであり、電子メールアドレスが含まれている場合と含まれていない場合があると想像してみてください。

そのドキュメント内の電子メールのすべてのインスタンスに一致する正規表現を見つけたいと思います。たとえば、。

まず、メールアドレスの特徴は、アドレスの中央に「@」の記号が付いていることです。 したがって、正規表現の中心のどこかにその特定の記号が必要であると想像できます。

また、メールアドレスの2番目の部分は、ウェブサイトを指している必要があることもわかっています。ウェブサイトは通常、ドットで区切られたトップレベルドメインとセカンドレベルドメインで構成されるドメイン名で示されます。 したがって、RegExの構造にさらに情報を追加すると、次のようになります。

「(一部の文字)@(セカンドレベルドメイン)(トップレベルドメイン)」

文字通りの形式で意図しているため、ドットの前にスラッシュ「\」があることに注意してください。 ここで最後に行う必要があるのは、「@」と「。」以外の文字にいくつかの追加条件を課すことです。 具体的には、可能性のある文字を英数字に制限し、「_」や「-」などの電子メールアドレスに一般的に存在するいくつかの記号を追加します。

4.4. 必要な正規表現

前のセクションの考慮事項を要約すると、ドキュメント内の電子メールアドレスは次の文字列です。

  • 英数字またはアンダースコアやダッシュなどの記号の間にある「@」文字
  • 「。」 英数字またはいくつかの記号で囲まれた、「@」の少なくとも2文字後の文字
  • 少なくとも2文字で構成されるトップレベルドメイン
  • および英数字セットまたはセットに属する残りの文字
  • 最後に、空白で他のテキストと区切る必要があります

したがって、これらの条件を満たすRegExは次のとおりです。

「\b[A-Za-z0-9 .-_ +%] + @[A-Za-z0-9-。]+。[A-Za-z]{2、} \b」

5. 結論

この記事では、正規表現の構文規則について学習しました。

また、パターンマッチングのタスクを解決するためのそれらの使用法のいくつかの実用的な例を見ました。