の Python 3 用 Re モジュールのドキュメント。 正規表現の Re モジュール

正規表現は、ほぼすべてのプログラミング言語で非常に人気のあるコンポーネントです。 必要な情報にすばやくアクセスするのに役立ちます。 特に、テキストを処理する必要がある場合に使用されます。 Python にはデフォルトで特別なモジュールが付属しています。 re、正規表現の操作を担当します。

今日は、それが一般的に何であるか、それらを使用する方法、およびモジュールの使用方法について詳しく説明します re 役立ちます。

正規表現: はじめに

正規表現の用途は何ですか? ほとんど全て。 たとえば、次のとおりです。

  1. テキスト検証を必要とする Web アプリケーション。 典型的な例は、オンライン メール クライアントです。
  2. テキスト、データベースなどに関するその他のプロジェクト。

構文の解析を開始する前に、ライブラリの機能の基本原則をより詳細に理解する必要があります。 re そして、一般的に、それについて一般的に良いことは何ですか。 また、実際の実践からの例を示し、それらの使用のメカニズムについて説明します。 テキストでさまざまな操作を実行するのに適した、このようなテンプレートを作成できます。

Re ライブラリのテンプレートとは何ですか?

それを使用すると、さまざまなタイプの情報を検索し、それらに対応する情報を取得して、他の機能をより適応させることができます。 もちろん、このデータを処理するために。

たとえば、次のテンプレートを使用します。 s+. これは任意のスペース文字を意味します。 プラス記号を追加すると、パターンに複数のスペースが含まれることを意味します。 で呼び出されるタブ文字と一致することさえあります t+.

それらを使用する前に、ライブラリをインポートする必要があります Re. その後、特別なコマンドを使用してテンプレートをコンパイルします。 これは XNUMX つのステップで行われます。

>>>インポート再

>>> regex = re.compile('s+')

具体的には、このコードは、使用可能なテンプレートをコンパイルする操作を実行します。 たとえば、スペース (XNUMX つ以上) を検索します。

正規表現を使用して異なる文字列から個別の情報を取得する

次の情報を含む変数があるとします。

>>> テキスト = """100 INF インフォマティクス

213 マット数学  

156 ENG 英語»»»

XNUMX つのトレーニング コースが含まれています。 それらはそれぞれ、番号、コード、名前の XNUMX つの部分で構成されています。 これらの単語の間隔が異なることがわかります。 この行を別々の数字と単語に分割するにはどうすればよいですか? この目標を達成するには、次の XNUMX つの方法があります。

  1. 関数を呼び出す 再分割.
  2. 適用機能 split for 正規表現.

以下は、変数の各メソッドの構文を使用する例です。

>>> re.split('s+', テキスト)  

#または

>>> regex.split(テキスト)

出力: ['100', 'INF', 'コンピューター サイエンス', '213', 'MAT', 'Math', '156', 'ENG', 'English']

一般に、両方の方法を使用できます。 しかし実際には、関数を複数回使用するよりも、正規表現を使用する方がはるかに簡単です。 再分割.

XNUMX つの関数で一致を見つける

文字列から数値のみを抽出する必要があるとしましょう。 これには何をする必要がありますか?

re.findall()

関数の使用例は次のとおりです。 findall()を正規表現とともに使用すると、テキスト変数から XNUMX つまたは複数の数値の出現箇所を抽出できます。

>>> 印刷(テキスト)  

100 INF情報学

213 マット数学  

156 ENG 英語

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(テキスト)  

['100'、'213'、'156']

d 記号とともに、変数またはテキストにあるすべての数値を絶対的に示すテンプレートを使用しました。 そこに + を XNUMX つ追加したので、これは少なくとも XNUMX つの数値が存在する必要があることを意味します。 

* 記号を使用して、一致を検出するために数字の存在が必要ないことを指定することもできます。

しかし、私たちの場合、+ を使用したため、次のように抽出しました。 findall() テキストからのコースの 1 つ以上のデジタル指定。 したがって、この場合、正規表現は関数の設定として機能します。

re.search() と 再戦()

関数の名前から推測できるように、最初の関数はテキスト内で一致するものを検索します。 質問: 違いは何ですか? 見つけますか? ポイントは、前の関数のように、見つかった結果のシーケンス全体をリスト形式で返すのではなく、パターンに一致する特定のオブジェクトを返すことです。

次に、 re.match 関数が同じことを行います。 構文のみが異なります。 テンプレートは最初に配置する必要があります。 

これを示す例を見てみましょう。

>>> # テキストで変数を作成

>>> text2 = «»»INF情報学

213 MAT 数学 156″»»  

>>> # 正規表現をコンパイルしてパターンを探す

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('最初のインデックス: ', s.start())  

>>> print('最後のインデックス: ', s.end())  

>>> print(text2[s.start():s.end()]) 

最初のインデックス: 17 

最後のインデックス: 20

213

同様の結果を別の方法で取得したい場合は、関数を使用できます グループ().

テキストの一部を Re ライブラリに置き換える

テキストを置き換えるには、関数を使用します re.sub()。 コースのリストが少し変更されたとします。 各デジタル値の後にタブがあることがわかります。 私たちの仕事は、このすべてのシーケンスを XNUMX つの行に結合することです。 これを行うには、式 s+ を置き換える必要があります 渡すことができます 

元のテキストは次のとおりです。

# テキストで変数を作成

>>> text = """100 INF t 情報学

213 MATt演算  

156 ENG t 英語»»»  

>>> 印刷(テキスト)  

100情報 情報学

213マット 数学  

156 ANG 英語

必要な操作を実行するために、次のコード行を使用しました。

# 1 つ以上のスペースを XNUMX に置き換えます

>>> regex = re.compile('s+')  

>>> print(regex.sub(' ', text))  

その結果、XNUMX行になりました。 

101 COM コンピュータ 205 MAT 数学 189 ENG 英語

ここで、別の問題を考えてみましょう。 スペースを入れる作業はありません。 すべてのコース名が改行で始まることは、私たちにとってはるかに重要です。 これを行うには、例外に改行を追加する別の式が使用されます。 これはどういう表現ですか?

図書館 Re ネガティブ マッチングなどの機能をサポートします。 スラッシュの前に感嘆符が含まれているという点で、直接のものとは異なります。 つまり、改行文字をスキップする必要がある場合は、n の代わりに !n を記述する必要があります。

次のコードを取得します。

# 改行以外のすべてのスペースを削除  

>>> 正規表現 = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', text))  

100 INF情報学

213 マット数学  

156 ENG 英語

正規表現グループとは

正規表現のグループの助けを借りて、目的のオブジェクトを XNUMX 行ではなく、個別の要素の形で取得できます。 

コース番号、コード、名前を XNUMX 行ではなく、個別の要素として取得する必要があるとします。 タスクを完了するには、膨大な数の不要なコード行を記述する必要があります。 

実際、タスクは大幅に簡素化できます。 すべてのエントリのテンプレートをコンパイルし、括弧から取得する必要があるデータを指定するだけです。

非常に少ない数の行があります。 

# コース テキスト テンプレートのグループを作成し、それらを抽出します

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(course_pattern, text)  

[('100', 'INF', 'コンピューター サイエンス'), ('213', 'MAT', '数学'), ('156', 'ENG', '英語')]

「欲張り」マッチングの考え方

標準では、正規表現は一致するデータを最大限に抽出するようにプログラムされています。 そして、必要なものがはるかに少ない場合でも。

タグを取得する必要がある HTML コードのサンプルを見てみましょう。

>>> text = 「貪欲な正規表現マッチングの例」  

>>> re.findall('', テキスト)  

['貪欲な正規表現マッチングの例']

XNUMX つのタグだけを抽出する代わりに、Python は文字列全体を取得しました。 それが貪欲と呼ばれる理由です。

そして、タグだけを取得するにはどうすればよいですか? この場合、遅延マッチングを使用する必要があります。 このような式を指定するには、パターンの末尾にクエスチョン マークを追加します。

次のコードとインタープリターの出力が得られます。

>>> re.findall('', テキスト)  

["、"]

最初に出現したものだけを取得する必要がある場合は、メソッドが使用されます 探す ().

re.search('', テキスト).group()  

 

次に、開始タグのみが見つかります。

人気の表現テンプレート

以下は、最も一般的に使用される正規表現パターンを含む表です。

の Python 3 用 Re モジュールのドキュメント。 正規表現の Re モジュール

まとめ

正規表現を操作するための最も基本的な方法のみを検討しました。 いずれにせよ、それらがいかに重要であるかを見てきました。 ここでは、テキスト全体を解析する必要があるか、個々の断片を解析する必要があるか、ソーシャル ネットワーク上の投稿を分析する必要があるか、後で処理するためにデータを収集する必要があるかどうかに違いはありません。 正規表現は、この問題において信頼できるヘルパーです。

次のようなタスクを実行できます。

  1. メールアドレスや電話番号など、データの形式を指定します。
  2. 文字列を取得し、それをいくつかの小さな文字列に分割します。
  3. 検索、必要な情報の抽出、文字の一部の置換など、さまざまな操作をテキストに対して実行します。

正規表現を使用すると、重要な操作を実行することもできます。 一見すると、この科学を習得するのは簡単ではありません。 しかし実際には、すべてが標準化されているため、一度理解すれば十分です。その後、このツールは Python だけでなく、他のプログラミング言語でも使用できます。 Excel でさえ正規表現を使用してデータ処理を自動化しています。 したがって、このツールを使用しないのは罪です。

コメントを残す