Python 正規表現関数の理解と例

正規表現 (regex) は、正規表現の概要で説明されているように、文字列内のパターンを検索または照合するために使用される特殊な文字列です。 以前、JavaScript と PHP で正規表現を使用する方法を示しました。 この記事の焦点は Python 正規表現であり、Python で正規表現を操作する方法をよりよく理解できるようにすることを目的としています。

Python 正規表現オブジェクトの処理に関連するニュアンスをカバーしながら、プログラムで Python 正規表現関数とメソッドを効果的に使用する方法を学びます。

Python の正規表現モジュール: re および regex

Python には 2 つのモジュールがあります — reregex — これにより、正規表現の操作が容易になります。 お茶 re モジュールは Python に組み込まれていますが、 regex モジュールは Matthew Barnett によって開発され、PyPI で利用できます。 お茶 regex Barnett によるモジュールは、ビルトインを使用して開発されています re モジュールであり、両方のモジュールは同様の機能を備えています。 それらは実装の点で異なります。 ビルトイン re モジュールは 2 つの中で最も人気があるため、ここではそのモジュールを使用します。

Python の組み込み re モジュール

多くの場合、Python 開発者は re 正規表現を実行するときのモジュール。 正規表現構文の一般的な構造 (文字と記号) は変わりませんが、モジュールは、Python プログラムで正規表現を効果的に実行するためのいくつかの関数とメソッドを提供します。

を使用する前に re モジュールを作成するには、他の Python モジュールやライブラリと同じようにファイルにインポートする必要があります。

import re

これにより、現在のファイルでモジュールが使用可能になり、Python の正規表現関数とメソッドに簡単にアクセスできるようになります。 とともに re モジュールを使用すると、Python 正規表現オブジェクトを作成し、一致したオブジェクトを操作し、必要に応じてフラグを適用できます。

re 関数の選択。

お茶 re モジュールには次のような機能があります。 re.search()re.match()、 と re.compile()、これについて最初に説明します。

re.search(pattern, string, flags=0) と re.match(pattern, string, flags=0) の比較

お茶 re.search()re.match() Python 正規表現パターンの文字列を検索し、見つかった場合は一致を返します。 None 一致するオブジェクトが見つからない場合。

どちらの関数も、指定された文字列で見つかった最初に一致した部分文字列を常に返し、デフォルト値を維持します 0 フラグ用。 しかし、 search() 関数は文字列全体をスキャンして一致を見つけます。 match() 文字列の先頭でのみ一致を検索します。

パイソンの re.search() ドキュメンテーション:

スキャンスルー ストリング 正規表現が一致する最初の場所を探します パターン 一致を生成し、対応する一致オブジェクトを返します。 戻る None 文字列内のどの位置もパターンに一致しない場合。 これは、文字列のあるポイントで長さがゼロの一致を見つけることとは異なることに注意してください。

パイソンの re.match() ドキュメンテーション:

の先頭に 0 個以上の文字がある場合 ストリング 正規表現に一致 パターン、対応する一致オブジェクトを返します。 戻る None 文字列がパターンと一致しない場合。 これは長さゼロの一致とは異なることに注意してください。

さらに明確にするために、いくつかのコード例を見てみましょう。

search_result = [re.search](http://re.search)(r'd{2}', 'I live at 22 Garden Road, East Legon')

print(search_result)

print(search_result.group())

>>>>

<re.Match object; span=(10, 12), match='22'>

22
match_result = re.match(r'd{2}', 'I live at 22 Garden Road, East Legon')

print(match_result)

print(match_result.group())

>>>>

None

Traceback (most recent call last):

File "/home/ini/Dev./sitepoint/regex.py", line 4, in <module>

print(match_result.group())

AttributeError: 'NoneType' object has no attribute 'group'

上記の例から、 None 文字列の先頭に一致がなかったため、返されました。 年 AttributeError のときに提起された group() 一致するオブジェクトがないため、メソッドが呼び出されました:

match_result = re.match(r'd{2}', "45 cars were used for the president's convoy")

print(match_result)

print(match_result.group())

>>>>

<re.Match object; span=(0, 2), match='45'>

45

文字列の先頭にある一致オブジェクトである 45 を使用すると、 match() メソッドは問題なく動作します。

re.compile(パターン、フラグ = 0)

お茶 compile() 関数は、指定された正規表現パターンを受け取り、文字列またはテキストで一致を見つけるために使用される正規表現オブジェクトにコンパイルします。 また、 flag オプションの 2 番目の引数として。 このメソッドは、正規表現オブジェクトを変数に割り当てて、後で Python コードで使用できるため便利です。 常に生の文字列を使用することを忘れないでください r"..." Python 正規表現オブジェクトを作成するとき。

これがどのように機能するかの例を次に示します。

regex_object = re.compile(r'b[ae]t')

mo = regex_object.search('I bet, you would not let a bat be your president')

print(regex_object)

>>>>

re.compile('b[ae]t')

re.fullmatch (パターン、文字列、フラグ = 0)

この関数は、正規表現パターンとして渡される文字列、検索する文字列、およびオプションのフラグ引数の 2 つの引数を取ります。 文字列全体が指定された正規表現パターンに一致する場合、一致オブジェクトが返されます。 一致しない場合は、戻ります None:

regex_object = re.compile(r'Tech is the future')

mo = regex_object.fullmatch('Tech is the future, join now')

print(mo)

print([mo.group](http://mo.group)())

>>>>

None

Traceback (most recent call last):

File "/home/ini/Dev./sitepoint/regex.py", line 16, in <module>

print([mo.group](http://mo.group)())

AttributeError: 'NoneType' object has no attribute 'group'

コードは AttributeError、一致する文字列がないためです。

re.findall(パターン、文字列、フラグ = 0)

お茶 findall() 関数は、指定された文字列で見つかったすべての一致オブジェクトのリストを返します。 すべての一致が返されるまで、文字列を左から右にトラバースします。 以下のコード スニペットを参照してください。

regex_object = re.compile(r'[A-Z]w+')

mo = regex_object.findall('Pick out all the Words that Begin with a Capital letter')

print(mo)

>>>>

['Pick', 'Words', 'Begin', 'Capital']

上記のコード スニペットでは、正規表現は文字クラスと単語文字で構成されているため、一致する部分文字列が大文字で始まることが保証されます。

re.sub(パターン、repl、文字列、カウント=0、フラグ=0)

を使用して、文字列の一部を別の部分文字列に置き換えることができます。 sub() 関数。 少なくとも 3 つの引数を取ります: 検索パターン、置換文字列、および処理する文字列です。 一致するものが見つからない場合は、元の文字列がそのまま返されます。 count 引数を渡さない場合、デフォルトでは、関数は正規表現の 1 つ以上の出現を見つけ、すべての一致を置き換えます。

次に例を示します。

regex_object = re.compile(r'disagreed')

mo = regex_object.sub('agreed',"The founder and the CEO disagreed on the company's new direction, the investors disagreed too.")

print(mo)

>>>>

The founder and the CEO agreed on the company's new direction, the investors agreed too.

subn(パターン、repl、文字列、カウント=0、フラグ=0)

お茶 subn() 関数は次と同じ操作を実行します sub()、しかし、文字列と置換の数を含むタプルを返します。 以下のコード スニペットを参照してください。

regex_object = re.compile(r'disagreed')

mo = regex_object.subn('agreed',"The founder and the CEO disagreed on the company's new direction, the investors disagreed too.")

print(mo)

>>>>

("The founder and the CEO agreed on the company's new direction, the investors agreed too.", 2)

オブジェクトとメソッドの一致

もっている マッチオブジェクト 正規表現パターンが正規表現オブジェクトの指定された文字列と一致する場合に返されます search()match() 方法。 Match オブジェクトには、Python で正規表現を操作するときに役立つメソッドがいくつかあります。

マッチ.グループ([group1, …])

このメソッドは、一致オブジェクトの 1 つ以上のサブグループを返します。 単一の引数は、シグナル サブグループを返します。 複数の引数は、インデックスに基づいて複数のサブグループを返します。 デフォルトでは、 group() メソッドは、一致部分文字列全体を返します。 引数が group() サブグループよりも多いまたは少ない、 IndexError 例外がスローされます。

次に例を示します。

regex_object = re.compile(r'(+d{3}) (d{2} d{3} d{4})')

mo = regex_object.search('Pick out the country code from the phone number: +233 54 502 9074')

print([mo.group](http://mo.group)(1))

>>>>

+233

引数 1 に渡された group(1) メソッド — 上記の例に見られるように — ガーナの国コードを選択します +233. 引数なしでメソッドを呼び出すか、 0 引数として、一致オブジェクトのすべてのサブグループを返します:

regex_object = re.compile(r'(+d{3}) (d{2} d{3} d{4})')

mo = regex_object.search('Pick out the phone number: +233 54 502 9074')

print([mo.group](http://mo.group)())

>>>>

+233 54 502 9074

Match.groups (デフォルト = なし)

groups() 指定された文字列に一致するサブグループのタプルを返します。 正規表現パターン グループは常に括弧でキャプチャされます — () — これらのグループは、タプルの要素として、一致する場合に返されます。

regex_object = re.compile(r'(+d{3}) (d{2}) (d{3}) (d{4})')

mo = regex_object.search('Pick out the phone number: +233 54 502 9074')

print(mo.groups())

>>>>

('+233', '54', '502', '9074')

Match.start([group]) & Match.end([group])

お茶 start() メソッドは開始インデックスを返しますが、 end() メソッドは、一致オブジェクトの終了インデックスを返します。

regex_object = re.compile(r'sw+')

mo = regex_object.search('Match any word after a space')

print('Match begins at', mo.start(), 'and ends', mo.end())

print([mo.group](http://mo.group)())

>>>>

Match begins at 5 and ends 9

any

上記の例には、空白の後の任意の単語文字に一致する正規表現パターンがあります。 一致が見つかりました — ' any' — 5 位から 9 位まで。

Pattern.search(string[, pos[, endpos]])

お茶 pos value は、一致オブジェクトの検索を開始するインデックス位置を示します。 endpos 一致の検索を停止する場所を示します。 両方の値 posendpos で引数として渡すことができます search()match() 文字列の後のメソッド。 これがどのように機能するかです:

regex_object = re.compile(r'[a-z]+[0-9]')

mo = regex_object.search('find the alphanumeric character python3 in the string', 20 , 30)

print([mo.group](http://mo.group)())

>>>>

python3

上記のコードは、検索文字列内の任意の英数字を選択します。

検索は文字列インデックス位置 20 から始まり、30 で停止します。

re Regex フラグ

Python では、 フラグ 使用時 re のようなモジュールメソッド search()match()、正規表現により多くのコンテキストを提供します。 flags は、Python 正規表現エンジンが一致オブジェクトを見つける方法を指定するオプションの引数です。

re.I (re.IGNORECASE)

このフラグは、大文字と小文字を区別しない一致を実行するときに使用されます。 正規表現エンジンは、正規表現パターンの大文字または小文字のバリエーションを無視します。

regex_object = [re.search](http://re.search)('django', 'My tech stack comprises of python, Django, MySQL, AWS, React', re.I)

print(regex_object.group())

>>>>

Django

お茶 re.I 大文字か小文字かに関係なく、一致するオブジェクトが確実に見つかるようにします。

re.S (re.DOTALL)

お茶 '.' 特殊文字は、改行以外の任意の文字と一致します。 このフラグを導入すると、テキストまたは文字列のブロックの改行にも一致します。 以下の例を参照してください。

regex_object= [re.search](http://re.search)('.+', 'What is your favourite coffee flavor nI prefer the Mocha')

print(regex_object.group())

>>>>

What is your favourite coffee flavor

お茶 '.' character は、文字列の先頭からのみ一致を見つけ、改行で停止します。 の紹介 re.DOTALL flag は改行文字に一致します。 以下の例を参照してください。

regex_object= [re.search](http://re.search)('.+', 'What is your favourite coffee flavor nI prefer the Mocha', re.S)

print(regex_object.group())

>>>>

What is your favourite coffee flavor

I prefer the Mocha

re.M (re.MULTILINE)

デフォルトでは、 '^' 特殊文字は、文字列の先頭のみに一致します。 このフラグを導入すると、関数は各行の先頭で一致を検索します。 お茶 '$' 文字は、文字列の末尾のパターンのみに一致します。 しかし re.M flag は、各行の末尾でも一致を見つけることを保証します:

regex_object = [re.search](http://re.search)('^Jw+', 'Popular programming languages in 2022: nPython nJavaScript nJava nRust nRuby', re.M)

print(regex_object.group())

>>>>

JavaScript

re.X (re.VERBOSE)

場合によっては、Python の正規表現パターンが長くて厄介になることがあります。 お茶 re.X フラグは、正規表現パターン内にコメントを追加する必要がある場合に役立ちます。 を使用できます ''' コメント付きの複数行の正規表現を作成するための文字列形式:

email_regex = [re.search](http://re.search)(r'''

[a-zA-Z0-9._%+-]+ # username composed of alphanumeric characters

@ # @ symbol

[a-zA-Z0-9.-]+ # domain name has word characters

(.[a-zA-Z]{2,4}) # dot-something

''', 'extract the email address in this string [kwekujohnson1@gmail.com](mailto:kwekujohnson1@gmail.com) and send an email', re.X)

print(email_regex.group())

>>>>

[kwekujohnson1@gmail.com](mailto:kwekujohnson1@gmail.com)

Python での正規表現の実際の例

それでは、より実用的な例に飛び込んでみましょう。

Python パスワード強度テストの正規表現

正規表現の最も一般的な使用例の 1 つは、パスワードの強度をテストすることです。 新しいアカウントにサインアップするときは、強力なパスワードを確保するために、文字、数字、および文字の適切な組み合わせを入力するためのチェックがあります。

パスワードの強度をチェックする正規表現パターンの例を次に示します。

password_regex = re.match(r"""

^(?=.*?[A-Z]) # this ensures user inputs at least one uppercase letter

(?=.*?[a-z]) # this ensures user inputs at least one lowercase letter

(?=.*?[0-9]) # this ensures user inputs at least one digit

(?=.*?[#?!@$%^&*-]) # this ensures user inputs one special character

.{8,}$ #this ensures that password is at least 8 characters long

""", '@Sit3po1nt', re.X)

print('Your password is' ,password_regex.group())

>>>>

Your password is @Sit3po1nt

の使用に注意してください '^''$' 入力文字列 (パスワード) が正規表現と一致することを確認します。

ファイル正規表現でのPython検索と置換

この例の目標は次のとおりです。

  • ファイル「pangram.txt」を作成します。
  • シンプルなテキストをファイルに追加し、 "The five boxing wizards climb quickly."
  • 簡単な Python 正規表現を作成して検索し、「climb」を「jump」に置き換えて、パングラムを作成します。

これを行うためのコードを次に示します。



import re

file_path="pangram.txt"

text="climb"

subs="jump"



def search_and_replace(filePath, text, subs, flags=0):

with open(file_path, "r+") as file:



file_contents = [file.read](http://file.read)()

text_pattern = re.compile(re.escape(text), flags)

file_contents = text_pattern.sub(subs, file_contents)

[file.seek](http://file.seek)(0)

file.truncate()

file.write(file_contents)



search_and_replace(file_path, text, subs)

Python Web スクレイピング正規表現

場合によっては、インターネット上のデータを収集したり、Web スクレイピングなどの単純なタスクを自動化したりする必要がある場合があります。 正規表現は、特定のデータをオンラインで抽出する場合に非常に役立ちます。 以下に例を示します。

import urllib.request

phone_number_regex = r'(d{3}) d{3}-d{4}'

url = 'https://www.summet.com/dmsi/html/codesamples/addresses.html'



response = urllib.request.urlopen(url)



string_object = [response.read](http://response.read)().decode("utf8")



regex_object = re.compile(phone_regex)

mo = regex_object.findall(string_object)



print(mo[: 5])

>>>>

['(257) 563-7401', '(372) 587-2335', '(786) 713-8616', '(793) 151-6230', '(492) 709-6392']

結論

正規表現は、単純なものから複雑なものまでさまざまです。 上記の例が示すように、それらはプログラミングの重要な部分です。 Python の正規表現をよりよく理解するには、文字クラス、特殊文字、アンカー、グループ化構造などに慣れることから始めることをお勧めします。

Python での正規表現の理解を深めるために、さらに多くのことを行うことができます。 パイソン re モジュールを使用すると、すばやく簡単に起動して実行できます。

正規表現は、入力の検証や検索アルゴリズムの実装などを行うために記述する必要があるコードの量を大幅に削減します。

また、ソフトウェア エンジニアや開発者の技術面の面接では、正規表現の使用に関する質問がよく出てくるため、正規表現の使用に関する質問に答えることができるのも良いことです。

Leave a Comment

Your email address will not be published. Required fields are marked *