正規表現

[Python] 正規表現で括弧に囲まれた文字列を抽出する方法

Pythonで正規表現を使用して括弧に囲まれた文字列を抽出するには、reモジュールを使います。

具体的には、re.findall()re.search()を使用して、括弧内の文字列を抽出できます。

正規表現パターンとしては、例えばr'\(.*?\)'を使用します。

.*?は非貪欲マッチを意味し、最短の一致を返します。

括弧自体を含めずに中身だけを抽出したい場合は、r'\((.*?)\)'のようにグループ化を使います。

括弧に囲まれた文字列を抽出する方法

括弧を含む正規表現パターンの基本

正規表現は、特定のパターンにマッチする文字列を検索・抽出するための強力なツールです。

括弧に囲まれた文字列を抽出するためには、以下のような基本的なパターンを使用します。

  • \(: 開き括弧をエスケープ
  • \): 閉じ括弧をエスケープ
  • .*?: 任意の文字列を非貪欲にマッチ

このパターンを組み合わせることで、括弧内の文字列を抽出することができます。

非貪欲マッチと貪欲マッチの違い

  • 貪欲マッチ: 可能な限り多くの文字をマッチさせる。

例: .*

  • 非貪欲マッチ: 最小限の文字をマッチさせる。

例: .*?

非貪欲マッチを使用することで、最初の開き括弧から最初の閉じ括弧までの文字列を正確に抽出できます。

re.findall()を使った括弧内の文字列抽出

re.findall()関数を使用すると、文字列内のすべてのマッチをリストとして取得できます。

以下はその例です。

import re
text = "これは(サンプル)のテキストです。(Python)を使っています。"
pattern = r'\(.*?\)'
matches = re.findall(pattern, text)
print(matches)
['(サンプル)', '(Python)']

このコードでは、テキスト内のすべての括弧に囲まれた文字列を抽出しています。

re.search()を使った括弧内の文字列抽出

re.search()関数は、最初にマッチした部分を返します。

以下の例では、最初の括弧内の文字列を抽出します。

import re
text = "これは(サンプル)のテキストです。(Python)を使っています。"
pattern = r'\(.*?\)'
match = re.search(pattern, text)
if match:
    print(match.group())
(サンプル)

このコードでは、最初の括弧に囲まれた文字列を取得しています。

グループ化を使って括弧内の文字列のみを抽出する方法

グループ化を使用することで、括弧内の文字列だけを抽出することができます。

以下の例を見てみましょう。

import re
text = "これは(サンプル)のテキストです。(Python)を使っています。"
pattern = r'\((.*?)\)'
matches = re.findall(pattern, text)
print(matches)
['サンプル', 'Python']

このコードでは、括弧内の文字列のみをリストとして取得しています。

複数の括弧に囲まれた文字列を抽出する方法

複数の括弧に囲まれた文字列を抽出する場合も、re.findall()を使用するのが便利です。

以下の例では、すべての括弧内の文字列を抽出します。

import re
text = "これは(サンプル1)のテキストです。(サンプル2)と(サンプル3)があります。"
pattern = r'\((.*?)\)'
matches = re.findall(pattern, text)
print(matches)
['サンプル1', 'サンプル2', 'サンプル3']

このコードでは、テキスト内のすべての括弧に囲まれた文字列を抽出し、リストとして表示しています。

実際のコード例

単一の括弧内の文字列を抽出する例

単一の括弧内の文字列を抽出する基本的な例です。

以下のコードでは、テキスト内の最初の括弧に囲まれた文字列を取得します。

import re
text = "これは(サンプル)のテキストです。"
pattern = r'\((.*?)\)'
match = re.search(pattern, text)
if match:
    print(match.group())
(サンプル)

このコードでは、最初の括弧内の文字列「サンプル」を抽出しています。

複数の括弧内の文字列を抽出する例

複数の括弧に囲まれた文字列を抽出する場合、re.findall()を使用します。

以下の例では、すべての括弧内の文字列を取得します。

import re
text = "これは(サンプル1)のテキストです。(サンプル2)と(サンプル3)があります。"
pattern = r'\((.*?)\)'
matches = re.findall(pattern, text)
print(matches)
['サンプル1', 'サンプル2', 'サンプル3']

このコードでは、テキスト内のすべての括弧に囲まれた文字列をリストとして取得しています。

ネストされた括弧内の文字列を抽出する例

ネストされた括弧内の文字列を抽出するのは少し複雑ですが、以下のように正規表現を工夫することで可能です。

import re
text = "これは(サンプル(ネスト))のテキストです。"
pattern = r'\(([^()]*?(?:\([^()]*?\)[^()]*?)*?)\)'
matches = re.findall(pattern, text)
print(matches)
['サンプル(ネスト)']

このコードでは、ネストされた括弧内の文字列「サンプル(ネスト)」を抽出しています。

括弧を含む文字列全体を抽出する例

括弧を含む文字列全体を抽出する場合、以下のように正規表現を使用します。

import re

text = "これは(サンプル)のテキストです。(Python)を使っています。"
pattern = r'\(.*?\)'
matches = re.findall(pattern, text)
print(matches)
['(サンプル)', '(Python)']

このコードでは、括弧を含む文字列全体を抽出しています。

括弧内の特定のパターンを抽出する例

括弧内の特定のパターン(例えば、数字のみ)を抽出する場合、以下のように正規表現を使用します。

import re
text = "これは(123)のテキストです。(abc)もあります。(456)もあります。"
pattern = r'\((\d+)\)'
matches = re.findall(pattern, text)
print(matches)
['123', '456']

このコードでは、括弧内の数字 123456 を抽出しています。

応用例

中括弧や角括弧に囲まれた文字列を抽出する方法

中括弧 {} や角括弧 [] に囲まれた文字列を抽出するためには、正規表現のパターンを変更する必要があります。

以下の例では、両方のタイプの括弧を抽出します。

import re
text = "これは{サンプル1}のテキストです。[サンプル2]もあります。"
pattern = r'\{(.*?)\}|\[(.*?)\]'
matches = re.findall(pattern, text)
# 結果をフラットにする
flat_matches = [m for match in matches for m in match if m]
print(flat_matches)
['サンプル1', 'サンプル2']

このコードでは、中括弧と角括弧の両方に囲まれた文字列を抽出しています。

特定の文字列パターンを含む括弧内の文字列を抽出する方法

特定の文字列パターン(例えば、”特定”という文字を含む)を含む括弧内の文字列を抽出する場合、以下のように正規表現を使用します。

import re
text = "これは(特定のサンプル)のテキストです。(一般的なサンプル)もあります。"
pattern = r'\(.*?特定.*?\)'
matches = re.findall(pattern, text)
print(matches)
['(特定のサンプル)']

このコードでは、「特定」を含む括弧内の文字列を抽出しています。

括弧内の数字やアルファベットのみを抽出する方法

括弧内の数字やアルファベットのみを抽出する場合、以下のように正規表現を使用します。

import re
text = "これは(123)のテキストです。(abc)もあります。(456abc)もあります。"
pattern = r'\((\d+|[a-zA-Z]+)\)'
matches = re.findall(pattern, text)
print(matches)
['123', 'abc']

このコードでは、括弧内の数字とアルファベットを抽出しています。

複数行にまたがる括弧内の文字列を抽出する方法

複数行にまたがる括弧内の文字列を抽出するには、re.DOTALLフラグを使用します。

以下の例では、改行を含む括弧内の文字列を抽出します。

import re
text = """これは(サンプル1
のテキストです。)
これは(サンプル2)もあります。"""
pattern = r'\(.*?\)'
matches = re.findall(pattern, text, re.DOTALL)
print(matches)
['(サンプル1\nのテキストです。)', '(サンプル2)']

このコードでは、複数行にまたがる括弧内の文字列を抽出しています。

括弧内の文字列を置換する方法

括弧内の文字列を置換する場合、re.sub()を使用します。

以下の例では、括弧内の文字列を「置換後の文字列」に置き換えます。

import re
text = "これは(サンプル)のテキストです。"
pattern = r'\(.*?\)'
new_text = re.sub(pattern, '(置換後の文字列)', text)
print(new_text)
これは(置換後の文字列)のテキストです。

このコードでは、括弧内の文字列を指定した新しい文字列に置換しています。

まとめ

この記事では、Pythonの正規表現を使用して括弧に囲まれた文字列を抽出する方法について詳しく解説しました。

具体的には、単一の括弧や複数の括弧、さらにはネストされた括弧内の文字列を抽出するためのテクニックや、特定のパターンを含む文字列の抽出方法、さらには括弧内の文字列を置換する方法についても触れました。

正規表現は非常に強力なツールであり、さまざまな文字列操作に応用できるため、ぜひ実際のプロジェクトで活用してみてください。

これにより、より効率的にデータを処理し、必要な情報を迅速に取得できるようになるでしょう。

関連記事

Back to top button