概要
前のセクションでは、ファイルを開く、ファイルを読み取る、ファイルを書き込む、ファイルを閉じる、ファイル ポインターを移動する、ディレクトリ リストを取得するなど、Python のファイル操作を紹介しました。ここではPythonの正規表現について紹介します。正規表現は、テキスト内の照合、検索、置換などを行うための強力なツールであり、文字列を効率的かつ柔軟に操作する方法を提供します。正規表現を使用すると、文字列処理の効率が大幅に向上し、大量のテキスト データから特定のパターンに一致する文字列を迅速に見つけることができます。
正規表現の定義
正規表現 (正規表現、正規表現、正規表現とも呼ばれる) はテキスト パターンであり、特定のパターンに一致するテキストの検索、検証、置換に特に適しています。これは、通常の文字と特殊文字で構成されるテキスト パターンです。このパターンは文字列一致パターンを記述し、特定のパターンに一致する文字列の検索、置換、インターセプトに使用できます。
Python には、正規表現を処理するための組み込みの re モジュールが用意されています。re モジュールをインポートすると、その関数を使用して正規表現操作を実行できます。
正規表現の構文
Python 正規表現の構文には、特定のパターンを表すために使用できるいくつかの特殊文字とメタキャラクターが含まれています。次の表に、一般的に使用される Python 正規表現構文をいくつか示します。
文法 |
意味 |
。 |
改行を除く任意の文字に一致します |
^ |
文字列の先頭と一致します |
$ |
文字列の末尾に一致します |
* |
直前の部分式と 0 回以上一致します |
+ |
前の部分式と 1 回以上一致します |
? |
直前の部分式と 0 回または 1 回一致します。 |
() |
グループを示す括弧で囲まれた式と一致します |
a|b |
a または b に一致する |
{n} |
直前の部分式と正確に n 回一致します。 |
{n,} |
前の部分式と少なくとも n 回一致します。 |
{n,m} |
前の部分式と少なくとも n 回、最大 m 回一致します。 |
[...] |
一致する文字のセットを示します。例: [A-Za-z] は任意の文字または数字と一致します。 |
[^...] |
この文字セットが一致しないことを示します。たとえば、[^A-Za-z] は文字と数字を除く任意の文字に一致します。 |
\d |
[0-9] に相当する任意の 10 進数に一致します |
\D |
[^0-9] と同等の数値以外の文字と一致します。 |
\s |
[\f\n\r\t\v] と同等の、スペース、タブ、フォーム フィードなどの任意の空白文字と一致します。 |
\S |
[^ \f\n\r\t\v] と同等の空白以外の任意の文字と一致します。 |
\w |
[a-zA-Z0-9_] に相当する任意の文字、数字、アンダースコア文字と一致します。 |
\W |
[^a-zA-Z0-9_] に相当する、文字、数字、アンダースコア以外の文字と一致します。 |
さらに、正規表現で一般的な特殊文字クラスとエスケープ シーケンスがいくつかあります。以下の表を参照してください。
文法 |
意味 |
\t |
タブ (タブ) |
\n |
改行 |
\r |
キャリッジリターン |
\f |
フォームフィード |
\b |
バックスペース |
\\ |
バックスラッシュ自体 |
\' |
一重引用符自体 |
「 |
二重引用符自体 |
\0 |
ヌル文字 |
\xnn |
ASCII 文字 (nn は 2 桁の 16 進数) |
\unnnn |
Unicode 文字 (nnnn は 4 桁の 16 進数) |
再検索機能
re.search 関数は、正規表現に一致する文字列を検索し、一致オブジェクトを返します。複数のグループが一致した場合は最初のグループが返され、一致が見つからなかった場合は None が返されます。
re.search 関数は次のように定義されます。
re.search(パターン、文字列、フラグ=0)
各パラメータの意味は次のとおりです。
pattern : 照合する正規表現。
string : 検索する文字列。
flags : 正規表現の動作を制御するフラグ (オプション)。複数のフラグをビット単位の OR (|) 演算子で組み合わせて使用できます。たとえば、re.IGNORECASE を使用して大文字と小文字を区別したり、re.MULTILINE を使用して各行を個別に照合したりすることができます。
re.search 関数は一致オブジェクトを返します。一致が見つからない場合は None を返します。照合が成功すると、照合オブジェクトには次のプロパティが設定されます。
group(index) : 指定されたインデックスのグループを返すか、インデックスが存在しない場合は一致したテキスト全体を返します。
groups() : すべてのグループ (0 より大きいインデックス番号を持つグループ) を含むタプルを返します。
start(index) : 文字列内の指定されたインデックスにあるグループの開始位置を返します。
end(index) : 文字列内の指定されたインデックスにあるグループの終了位置を返します。
span(index) : 文字列内の指定されたインデックスにあるグループ化の開始位置と終了位置のタプルを返します。
次のメソッドは、一致が失敗した場合に例外をスローします。
group(index) : 存在しないグループに対して一致する結果を取得しようとすると、例外がスローされます。
start(index)、end(index)、span(index) : 存在しないグループの境界位置を取得しようとすると、例外がスローされます。
以下のサンプルコードを通じて re.search 関数を理解することができます。
import re
text = "Hello CSDN!"
result = re.search('(CSDN)', text)
if result:
# 输出:Found: CSDN (6, 10)
print("Found:", result.group(1), result.span(1))
else:
print("Not found")
text = 'be greater than ever'
result = re.search('(.*) greater (.*?) .*', text)
if result:
# 输出:Found all: be greater than ever
print ("Found all:", result.group())
# 输出:Found group 1: be
print ("Found group 1:", result.group(1))
# 输出:Found group 2: than
print ("Found group 2:", result.group(2))
else:
print("Not found")
再一致関数
re.match 関数は、文字列の先頭で正規表現の一致を実行し、一致オブジェクトを返すために使用されます。一致するものが見つからない場合は None を返します。re.match 関数と re.search 関数の違いは、re.match 関数は文字列の先頭のみと一致することです。文字列が先頭の正規表現と一致しない場合、一致は失敗し、None を返します。 re.search 関数は、一致する文字列が見つかるまで文字列全体を照合します。
import re
text = 'Hello CSDN'
result = re.match('Hello', text)
# 从字符串的开始处进行匹配,能找到,输出:Found: Hello
if result:
print("Found:", result.group())
else:
print("Not found")
text = 'CSDN Hello'
result = re.match('Hello', text)
# 从字符串的开始处进行匹配,找不到,输出:Not found
if result:
print("Found:", result.group())
else:
print("Not found")
text = '[email protected]'
result = re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', text)
# 校验是否为有效的电子邮件地址,输出:Found
if result:
print("Found")
else:
print("Not found")
re.findall関数
re.findall() 関数は、文字列内のすべての一致する部分を検索し、すべての一致する部分を含むリストを返すために使用されます。
re.findall() 関数は次のように定義されます。
re.findall(パターン, 文字列)
このうち、パターンは検索対象と一致するために使用される正規表現であり、文字列は一致するものを検索する文字列です。返されるリストには、一致するすべての部分が含まれます。一致するものが見つからない場合は空のリストが含まれます。
import re
text = "Hello, CSDN! Be greater than ever."
matches = re.findall(r'\b\w+\b', text)
# 输出:['Hello', 'CSDN', 'Be', 'greater', 'than', 'ever']
print(matches)
re.sub関数
re.sub() 関数は、文字列内で正規表現を使用して置換操作を実行するために使用され、一致した文字列が指定された置換オブジェクトで置き換えられた新しい文字列を返します。
re.sub() 関数は次のように定義されます。
re.sub(パターン、repl、文字列、カウント=0、フラグ=0)
各パラメータの意味は次のとおりです。
pattern : 照合する正規表現。
repl : 一致した文字列を置換するために使用される置換オブジェクト。
string : 置換する元の文字列。
count : 置換の最大数を指定します (オプション)。デフォルトは 0 で、一致する文字列をすべて置き換えることを意味します。
flags : 正規表現の動作を制御するフラグ (オプション)。複数のフラグをビット単位の OR (|) 演算子で組み合わせて使用できます。
以下のサンプル コードでは、 re.sub() 関数を使用して文字列内のすべての単語を「CSDN」に置き換えます。正規表現 \b\w+\b は単語の境界と単語自体に一致します。
import re
text = "Hello, world! Be greater than ever."
result = re.sub(r'\b\w+\b', 'CSDN', text)
# 输出:CSDN, CSDN! CSDN CSDN CSDN CSDN.
print(result)
再コンパイル関数
re.compile() 関数は、指定された正規表現を再利用可能な正規表現オブジェクトにコンパイルするために使用され、繰り返しの一致または検索操作に使用できる正規表現オブジェクトを返します。
re.compile() 関数は次のように定義されます。
re.compile(パターン、フラグ=0)
各パラメータの意味は次のとおりです。
pattern : コンパイルする正規表現文字列。
flags : 正規表現の動作を制御するフラグ (オプション)。複数のフラグをビット単位の OR (|) 演算子で組み合わせて使用できます。
以下のサンプル コードでは、 re.compile() 関数を使用して正規表現 \d\w\d を再利用可能な正規表現オブジェクトにコンパイルし、このオブジェクトを検索操作に使用します。
import re
pattern = re.compile(r'\d+\w+\d+')
result = pattern.search('Hello 666OK999 CSDN')
# 输出:666OK999
print(result.group())
re.finder関数
re.finditer() 関数は、文字列内の正規表現の一致を検索するために使用され、一致した結果を含む反復子を返します。各一致結果は Match オブジェクトであり、一致した文字列はオブジェクトの group() メソッドを通じて取得できます。
re.finditer() 関数は次のように定義されます。
re.finditer(パターン、文字列、フラグ=0)
各パラメータの意味は次のとおりです。
pattern : 照合する正規表現パターン。
string : 一致する文字列を検索します。
flags : 正規表現の動作を制御するフラグ (オプション)。複数のフラグをビット単位の OR (|) 演算子で組み合わせて使用できます。
次のサンプル コードでは、 re.finditer() 関数を使用して一致するオブジェクトのイテレータを取得し、そのイテレータをトラバースして一致する文字列を出力します。
import re
text = 'Hello 666 CSDN 999'
pattern = re.compile(r'\d+')
matches = pattern.finditer(text)
# 依次输出:666 999
for match in matches:
print(match.group())
再分割機能
re.split() 関数は、正規表現に従って文字列を分割し、分割された部分文字列のリストを返すために使用されます。
re.split() 関数は次のように定義されます。
re.split(パターン, 文字列, maxsplit=0)
各パラメータの意味は次のとおりです。
pattern : 文字列を分割するために使用する正規表現パターン。
string : 分割する文字列。
maxsplit : 分割の最大数を指定します (オプション)。このパラメータを指定すると、正規表現に従ってmaxsplit回まで分割されます。デフォルト値は 0 で、制限がないことを意味します。
以下のサンプル コードでは、 re.split() 関数を使用して文字列を分割し、分割された部分文字列のリストを返します。
import re
text = 'ocean-sky-continent'
result = re.split('-', text)
# 输出:['ocean', 'sky', 'continent']
print(result)