Python テキスト処理

テキスト処理について、基礎から応用までの内容をいくつかのセクションに分けて解説します。各セクションで具体例を交えながら説明します。

セクション1: 文字列のチェックメソッド

Pythonの文字列メソッドには、文字列の内容をチェックするためのさまざまなメソッドがあります。以下に主要なメソッドを紹介します。

str.isalpha()

文字列がアルファベットのみで構成されているかをチェックします。

s = "hello"
print(s.isalpha())  # True

s = "hello123"
print(s.isalpha())  # False

str.isdigit()

文字列が数字のみで構成されているかをチェックします。

s = "12345"
print(s.isdigit())  # True

s = "12345abc"
print(s.isdigit())  # False

str.isalnum()

文字列がアルファベットまたは数字のみで構成されているかをチェックします。

s = "hello123"
print(s.isalnum())  # True

s = "hello 123"
print(s.isalnum())  # False

str.isspace()

文字列が空白文字のみで構成されているかをチェックします。

s = "   "
print(s.isspace())  # True

s = "  a  "
print(s.isspace())  # False

str.islower()

文字列がすべて小文字で構成されているかをチェックします。

s = "hello"
print(s.islower())  # True

s = "Hello"
print(s.islower())  # False

str.isupper()

文字列がすべて大文字で構成されているかをチェックします。

s = "HELLO"
print(s.isupper())  # True

s = "Hello"
print(s.isupper())  # False

文字列定数を利用する

Pythonの string モジュールには、文字列定数が定義されています。これらの定数を利用すると、特定の文字セットに対する操作が簡単になります。

import string

print(string.ascii_letters)  # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.ascii_lowercase)  # abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase)  # ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)  # 0123456789
print(string.punctuation)  # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
print(string.whitespace)  #  \t\n\r\x0b\x0c

フォーマット

文字列のフォーマットには、以下の3つの方法があります。

1. % 演算子

name = "Alice"
age = 30
print("Name: %s, Age: %d" % (name, age))  # Name: Alice, Age: 30

2. str.format()

name = "Bob"
age = 25
print("Name: {}, Age: {}".format(name, age))  # Name: Bob, Age: 25
print("Name: {0}, Age: {1}".format(name, age))  # Name: Bob, Age: 25
print("Name: {n}, Age: {a}".format(n=name, a=age))  # Name: Bob, Age: 25

3. f-strings(Python 3.6以降)

name = "Charlie"
age = 35
print(f"Name: {name}, Age: {age}")  # Name: Charlie, Age: 35

unicodedata モジュール

unicodedata モジュールを使うと、Unicode文字に関するデータを扱うことができます。

例:文字の名前を取得する

import unicodedata

char = 'A'
print(unicodedata.name(char))  # LATIN CAPITAL LETTER A

例:文字の名前から文字を取得する

print(unicodedata.lookup('LATIN CAPITAL LETTER A'))  # A

:正規化

Unicodeの正規化を行うことで、同じ文字の異なる表現を統一できます。

s1 = 'é'
s2 = 'e\u0301'  # 'e' と 結合文字 '´'

print(s1 == s2)  # False

s1_normalized = unicodedata.normalize('NFC', s1)
s2_normalized = unicodedata.normalize('NFC', s2)
print(s1_normalized == s2_normalized)  # True

その他のおすすめ内容

1. 文字列の分割と結合

分割:str.split()
結合:str.join()

s = "apple,banana,cherry"
fruits = s.split(",")
print(fruits)  # ['apple', 'banana', 'cherry']

joined_string = ",".join(fruits)
print(joined_string)  # apple,banana,cherry

2. 部分文字列の検索と置換

検索:str.find(), str.index(), str.count()
置換:str.replace()

s = "hello world"

# 検索
print(s.find("world"))  # 6
print(s.index("world"))  # 6
print(s.count("l"))  # 3

# 置換
print(s.replace("world", "Python"))  # hello Python

3. 大文字と小文字の変換

小文字に変換:str.lower()
大文字に変換:str.upper()
タイトルケースに変換:str.title()
キャピタライズ:str.capitalize()

s = "hello world"
print(s.lower())  # hello world
print(s.upper())  # HELLO WORLD
print(s.title())  # Hello World
print(s.capitalize())  # Hello world

文字列定数は、特定の文字セットを扱う際に便利です。以下に、文字列定数の具体的な活用方法をいくつか示します。

文字列定数の活用例

1. 特定の文字セットのフィルタリング

文字列定数を使用して、特定の文字セットだけを含む新しい文字列を作成することができます。例えば、文字列からアルファベットだけを抽出する場合です。

import string

s = "Hello, World! 123"
filtered = ''.join([char for char in s if char in string.ascii_letters])
print(filtered)  # HelloWorld

2. 特定の文字セットの検出

文字列に特定の文字セットが含まれているかどうかを検出する場合に、文字列定数を使用できます。

import string

s = "Hello123"
contains_digit = any(char in string.digits for char in s)
print(contains_digit)  # True

3. カスタム文字セットのバリデーション

ユーザー入力が特定の文字セットのみを含むかどうかを検証する場合に役立ちます。例えば、パスワードが英数字と特定の記号だけを含むことを確認する場合です。

import string

def is_valid_password(password):
    valid_chars = string.ascii_letters + string.digits + "!@#$%^&*"
    return all(char in valid_chars for char in password)

password = "P@ssw0rd!"
print(is_valid_password(password))  # True

invalid_password = "P@ssw0rd!<>"
print(is_valid_password(invalid_password))  # False

4. 特定の文字セットの生成

特定の文字セットを用いてランダムな文字列を生成することもできます。例えば、ランダムなパスワードの生成です。

import string
import random

def generate_random_password(length):
    characters = string.ascii_letters + string.digits + string.punctuation
    return ''.join(random.choice(characters) for _ in range(length))

print(generate_random_password(12))  # 例: G5^fK@1L!m#T

5. 特定の文字セットを使った翻訳テーブルの作成

文字列定数を使って文字の変換や置換を簡単に行うための翻訳テーブルを作成できます。

import string

# すべての小文字を大文字に変換する翻訳テーブルを作成
translation_table = str.maketrans(string.ascii_lowercase, string.ascii_uppercase)
s = "hello world"
print(s.translate(translation_table))  # HELLO WORLD

まとめ

文字列定数を活用することで、特定の文字セットを簡単に操作できるようになります。これにより、フィルタリング、バリデーション、文字列の生成、翻訳など、さまざまな文字列操作が効率的に行えるようになります。

文字列のエンコードとデコード

Pythonでは、文字列は内部的にUnicode形式で管理されていますが、外部とのデータ交換(例えばファイルやネットワーク通信)ではエンコードとデコードが必要です。このセクションでは、エンコードとデコードの方法について説明します。

1. 文字列のエンコード

文字列を特定のエンコーディング形式に変換するために encode() メソッドを使用します。

s = "こんにちは"
encoded_s = s.encode("utf-8")
print(encoded_s)  # b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'

2. バイト列のデコード

バイト列を元の文字列に戻すために decode() メソッドを使用します。

例:Unicode正規化

import unicodedata

s1 = 'é'  # U+00E9 (LATIN SMALL LETTER E WITH ACUTE)
s2 = 'e\u0301'  # U+0065 U+0301 (LATIN SMALL LETTER E + COMBINING ACUTE ACCENT)

# 正規化せずに比較
print(s1 == s2)  # False

# 正規化して比較
s1_normalized = unicodedata.normalize('NFC', s1)
s2_normalized = unicodedata.normalize('NFC', s2)
print(s1_normalized == s2_normalized)  # True

高度な文字列操作例

ここでは、文字列操作の応用例をいくつか紹介します。

1. 文字列のパディング

文字列の左右に特定の文字を追加して、指定した長さに揃える操作です。

s = "42"
padded_s = s.zfill(5)
print(padded_s)  # 00042

2. 文字列のトリミングとセンタリング

文字列の左右に特定の文字を追加して、中央揃えにする操作です。

s = "center"
centered_s = s.center(10, "*")
print(centered_s)  # **center**

3. 文字列の部分一致と置換

複雑な置換を行う場合、正規表現を使うと便利です。

import re

s = "The quick brown fox jumps over the lazy dog."
# 全ての "o" を "*" に置換
new_s = re.sub(r'o', '*', s)
print(new_s)  # The quick br*wn f*x jumps *ver the lazy d*g.

unicodedata モジュールの詳細

unicodedata モジュールは、Unicodeデータベースへのアクセスを提供します。これにより、文字の名前やカテゴリなどの情報を取得できます。

1. 文字の名前の取得

import unicodedata

char = 'A'
print(unicodedata.name(char))  # LATIN CAPITAL LETTER A

2. 文字の名前から文字を取得

print(unicodedata.lookup('LATIN CAPITAL LETTER A'))  # A

3. 文字のカテゴリを取得

char = 'A'
print(unicodedata.category(char))  # Lu (Letter, Uppercase)

4. 文字の結合クラスを取得

char = 'é'
print(unicodedata.combining(char))  # 0 (結合文字ではない)
char = '́'  # U+0301 (Combining Acute Accent)
print(unicodedata.combining(char))  # 230 (結合文字)

まとめ

ここまでで、文字列のエンコードとデコード、正規化、高度な文字列操作例、unicodedata モジュールの詳細について説明しました。これらの技術は、テキスト処理において非常に重要であり、実践的な場面でも多く使われます。

文字列処理の応用例

文字列処理の応用例をいくつか紹介します。これらの例を通じて、文字列操作の実際の使用方法を学びます。

1. 文字列の逆転

文字列を逆順にする方法を紹介します。

s = "hello"
reversed_s = s[::-1]
print(reversed_s)  # olleh

アナグラムのチェック

2つの文字列がアナグラム(同じ文字を使って異なる順序に並べ替えたもの)であるかどうかをチェックします。

3. パリンドロームのチェック

文字列が前後対称(パリンドローム)であるかどうかをチェックします。

4. 最頻出文字のカウント

文字列中で最も頻繁に出現する文字をカウントします。

from collections import Counter

def most_common_char(s):
    counter = Counter(s)
    return counter.most_common(1)[0]

print(most_common_char("hello world"))  # ('l', 3)

5. 文字列の圧縮

ランレングス圧縮(Run-Length Encoding)を用いて文字列を圧縮します。

def run_length_encode(s):
    encoded = []
    i = 0

    while i < len(s):
        count = 1
        while i + 1 < len(s) and s[i] == s[i + 1]:
            i += 1
            count += 1
        encoded.append(f"{s[i]}{count}")
        i += 1

    return ''.join(encoded)

print(run_length_encode("aaabbcddd"))  # a3b2c1d3

6. 文字列のトークン化

文字列を単語に分割(トークン化)します。

s = "Hello, world! This is a test."
tokens = s.split()
print(tokens)  # ['Hello,', 'world!', 'This', 'is', 'a', 'test.']

1. メールアドレスの抽出

テキストからメールアドレスを抽出します。

import re

text = "Please contact us at support@example.com for further information."
email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
emails = re.findall(email_pattern, text)
print(emails)  # ['support@example.com']

2. 電話番号のフォーマット

テキスト中の電話番号を統一されたフォーマットに変換します。

import re

text = "Call me at 123-456-7890 or 987.654.3210!"
phone_pattern = r'(\d{3})[-.](\d{3})[-.](\d{4})'
formatted_text = re.sub(phone_pattern, r'(\1) \2-\3', text)
print(formatted_text)  # Call me at (123) 456-7890 or (987) 654-3210!

3. HTMLタグの削除

HTML文字列からタグを削除してプレーンテキストを抽出します。

import re

html = "<p>Hello, <b>world</b>!</p>"
tag_pattern = r'<.*?>'
plain_text = re.sub(tag_pattern, '', html)
print(plain_text)  # Hello, world!

セクション14: テキストの正規化とクリーニング

1. 全角・半角の統一

全角文字と半角文字を統一します。

import unicodedata

def normalize_text(text):
    return unicodedata.normalize('NFKC', text)

s = "ABCDEFG abcdefg 123"
normalized_s = normalize_text(s)
print(normalized_s)  # ABCDEFG abcdefg 123

2. 不要な空白の削除

テキストから不要な空白を削除します。

s = "  Hello   world  "
cleaned_s = ' '.join(s.split())
print(cleaned_s)  # Hello world

まとめ

ここまでで、文字列処理の応用例、正規表現の応用、テキストの正規化とクリーニングについて説明しました。これらの技術は、実際のテキスト処理やデータクリーニングの場面で非常に有用です。


この記事が気に入ったらサポートをしてみませんか?