この記事では、Python の強力なツールである正規表現について詳しく説明します。正規表現は、テキストの一致、検索、置換、解析に使用できる強力なテキスト処理ツールです。基本的な構文、一般的な使用法、高度なテクニックなど、Python で正規表現を使用する方法を段階的に説明します。最後の「もう 1 つ」セクションでは、あまり知られていないが非常に便利な正規表現のトリックを検討します。
単純な正規表現マッチング
Python では、re
モジュールは正規表現のサポートを提供します。最も単純な文字マッチングから始めましょう。
import re
# 检查字符串是否包含字母"a"
txt = "Hello, world!"
match = re.search("a", txt)
print(match) # 输出:None,因为"a"没有在字符串中
この例では、re.search()
関数を使用して文字列に「a」が含まれているかどうかを確認しました。これは最も基本的な文字一致ですが、正規表現の有用性がすでにわかります。たとえば、メールアドレスに「@」が含まれているかどうかをこの方法で確認できます。
メタキャラクターを使用する
.
正規表現の真の力は、*
、?
、[]
などのメタ文字の使用にあります。次の例は、(ドット) メタキャラクタを使用して任意の文字 (改行を除く) と一致させる方法を示しています.
。
txt = "Hello, world!"
match = re.search("H.llo", txt)
print(match.group()) # 输出:Hello
この例では、.
文字は「e」と一致するため、「H.llo」は「Hello」と一致します。
事前定義された文字セットを使用する
場合によっては、単一の文字ではなく文字のクラスを一致させたいことがあります。たとえば、任意の数値と一致させたい場合があります。Python の正規表現は、この機能を実現するために事前定義された文字セットを提供します。\d
は任意の数字を表します。
txt = "123 Hello, world!"
match = re.search("\d+", txt)
print(match.group()) # 输出:123
この例では、\d+
数字の文字列「123」が一致します。
グループ化とキャプチャ
かっこを使用して()
サブパターンまたはグループを作成し、group()
メソッドを使用してこれらのグループをキャプチャできます。
txt = "123 Hello, world!"
match = re.search("(\d+) (Hello),", txt)
print(match.group(1)) # 输出:123
print(match.group(2)) # 输出:Hello
前方先読みアサーションを使用する
文字を消費せずにマッチングできる高機能な技です。たとえば、ピリオドで終わるがピリオドを含まないすべての文を検索したい場合があります。
txt = "Hello. My name is Python. Nice to meet you."
matches = re.findall(".*?(?=\\.)", txt)
for match in matches:
print(match) # 输出:Hello,My name is Python,Nice to meet you
この例では、.*?(?=\\.)
ピリオドで終わるすべての文が一致しますが、ピリオドは消費されません。
文字セットと範囲
事前定義された文字セットについては以前に説明しました\d
。ただし、カスタム文字セットが必要になる場合があります。角括弧を使用して[]
この目的を達成できます。たとえば、小文字のみを含む文字セットを作成できます。
txt = "Hello, World!"
match = re.search("[a-z]+", txt)
print(match.group()) # 输出:ello
この例では、[a-z]+
連続する小文字の文字列「ello」が一致します。「Hello」の頭文字「H」は大文字のため一致しないことに注意してください。
貪欲なマッチングと非貪欲なマッチング
Python の正規表現はデフォルトで貪欲です。つまり、可能な限り多くの文字と一致します。ただし、欲張らないマッチングを実行したい場合もあります。?
これを行うには、量指定子の後に疑問符を追加します。
txt = "12345"
match = re.search("\d+?", txt)
print(match.group()) # 输出:1
この例では、\d+?
非貪欲一致が実行され、1 つの数字「1」のみが一致します。
ゼロ幅アサーション
ゼロ幅アサーションを使用すると、文字の間に条件を置くことができます。たとえば、(?<=a)b
「a」の後に出現する「b」をすべて一致させるために使用できます。
txt = "cab, dab"
matches = re.findall("(?<=a)b", txt)
for match in matches:
print(match) # 输出:b,b
この例では、(?<=a)b
「a」の後に出現する「b」がすべて一致します。
コンパイルされた正規表現を使用する
プログラムで同じ正規表現を複数回使用する必要がある場合は、プログラムを正規表現オブジェクトにコンパイルできます。これにより、コードの実行効率が向上します。
pattern = re.compile("\d+")
txt = "123 Hello, world!"
match = pattern.search(txt)
print(match.group()) # 输出:123
この例では、最初に正規表現をコンパイルし\d+
、次にpattern.search()
メソッドを使用して照合します。
もう一つ
ここまで、Python の正規表現の基本について説明してきました。しかし、この最後の「もう 1 つのこと」セクションでは、あまり言及されていないものの、複雑なテキスト パターンを扱うときに非常に役立つトリック、つまり名前付きグループを共有したいと思います。
名前付きグループを使用すると、一致するグループに名前を割り当て、コードの後半でそれを参照できます。これは、複雑なパターン マッチングを処理する場合に非常に役立ちます。
txt = "James: 1234567890"
match = re.search("(?P<name>\w+): (?P<phone>\d+)", txt)
print(match.group('name')) # 输出:James
print(match.group('phone')) # 输出:1234567890
この例では、名前付きグループ(?P<name>\w+)
と を使用して(?P<phone>\d+)
名前と電話番号を照合し、group()
それらを取得するメソッドを使用しました。
正規表現は非常に強力なツールです。この記事が Python での正規表現の使い方をマスターするのに役立つことを願っています。
お役に立ちましたら、WeChat の個人公開アカウントにもっと注目してください: [Python の全体像] TeahLead_KrisChang、インターネットおよび人工知能業界で 10 年以上の経験、テクノロジーおよびビジネス チーム管理で 10 年以上の経験、Tongji Softwareエンジニアリング学士、復丹エンジニアリング管理マスター、Aliyun 認定クラウド サービス シニア アーキテクト、数億の収益を誇る AI 製品ビジネスの責任者。