Pythonでテキスト処理を行ってみた！

今回はPythonでテキスト処理全般を行ってみます。

文字列リストを連結したい

文字列には、文字列リストを特定の文字で連結するjoinメソッドがあります。以下のコードでは、文字列が格納されたリストに対し、空白で単純に連結、カンマ区切りで連結しています。

```py
text_list = ['abc', 'def', 'ghi']
test1 = ''.join(text_list)
print(test1)
test2 = ','.join(text_list)
print(test2)
```

実行結果
abcdefghi
abc,def,ghi

また、mapと組み合わせると文字列以外と合わせて連結することも可能です。


文字列に値を埋め込みたい

formatメソッド
文字列に値を埋め込む方法はいくつかあるのですが、以下2つがよく使われます。

・formatメソッド
・フォーマット済み文字列リテラル

置換フィールド

文字列に値を埋め込みたい箇所に記述する目印を、置換フィールドと呼びます。置換フィールドは中括弧で記述しますが、記法は3通りあり、置換フィールドの書式に応じてformatメソッドの引数の形式が異なります。

```py
# 中括弧単体
text = "こんにちは、{}さん。現在{}時です。"
name = "Suzuki"
time = 10

ftext = text.format(name, time)
print(ftext)

# フィールド番号
text = "こんにちは、{0}さん。現在{1}時です。"
name = "Suzuki"
time = 10

ftext = text.format(name, time)
print(ftext)


# フィールド名
text = "こんにちは、{name}さん。現在{time}時です。"
name = "Suzuki"
time = 10

ftext1 = text.format(name=name, time=time)
print(ftext1)
```
実行結果
こんにちは、Suzukiさん。現在10時です。
こんにちは、Suzukiさん。現在10時です。
こんにちは、Suzukiさん。現在10時です。

フォーマット済み文字列リテラルを使いたい

Python3.6以降、フォーマット済み文字列リテラルという機能が追加されました。通常の文字列リテラルの先頭にfもしくはFをつけ、代入したい変数を中括弧でくくるだけで変数が埋め込まれます。

```py
name = "Suzuki"
time = 10
text = f"こんにちは、{name}さん。現在{time}時です。"
print(text)
```

実行結果
こんにちは、Suzukiさん。現在10時です。


文字列を置換したい

文字列には、replaceメソッドという置換用のメソッドがあります。以下のコードでは、適当な文字列text1のスペースをアンダーバーに置換しています。戻り値で置換後の文字列が得られ、元の文字列自体は更新されないという点に注意が必要です。

```py
text1 = "Simple is better than complex."
text2 = text1.replace(' ', '_')
print(text1)
print(text2)
```

実行結果
Simple is better than complex.
Simple_is_better_than_complex.

count指定

また、第3引数を指定すると置換回数を指定することができます。最初の1回だけ置換する場合、以下のようにして記述します。

```py
text1 = "Simple is better than complex."
text2 = text1.replace(' ', '_', 1)
print(text1)
print(text2)
```

実行結果
Simple is better than complex.
Simple_is better than complex.


文字列が含まれるか判定したい

inはリストやsetに要素が含まれているかどうかを判定しますが、文字列の場合はある文字列が含まれるかどうかを判定することができます。結果はboolで返されます。大文字小文字全角半角は、厳密に区別されるという点に注意が必要です。以下のコードでは、ある文字列に"pen"という文字列が含まれているかどうかを判定し、結果をprint出力しています。

```py
text = "This is a pen."
contains =  "pen" in text
print(contains)
```

実行結果
True

大文字小文字を区別をしたくない場合は、いったんどちらかにすべて置換する方法があります。以下のコードでは、いったんすべて小文字に置換して判定しています。

```py
text = "This is a pen."
contains =  "THIS".lower() in text.lower()
print(contains)
```

実行結果
True

文字列の一部を取り出したい

文字列はシーケンスなので、インデックスを指定して文字を取り出すことができます。末尾は-1で指定することができます。例えば、ある文字列の（0から数えて）0番目、3番目、末尾を取り出す場合、以下のように記述します。

```py
text = 'abcdefg'
c1 = text[0]
c2 = text[3]
c3 = text[-1]
print(c1, c2, c3)
```

実行結果
a d g

さらにリストなどのシーケンスと同様、スライス構文を使用するとインデックスで指定した範囲の文字を切り出すことができます。以下のコードでは、文字列の（0から数えて）3番目から5番目まで取り出しています。

```py
text = 'abcdefg'
sub_strig = text[3:6]
print(sub_strig)
```

実行結果
def

文字列の不要な空白を除去したい

テキスト処理していると、前後に不要な空白が出てくることがあります。正規表現等で置換してもよいのですが、Pythonの文字列には不要な文字列を除去するstripというメソッドが用意されています。以下のコードでは、両側の空白のあるテキストをトリミングしてprint出力しています。トリミングされていることを確認するため、print出力時に両端に"*"を表示させています。

```py
text = " abcdefg "
stripped = text.strip()
print("*" + stripped + "*")
```

実行結果
*abcdefg*

また、右側もしくは左側のみ空白を除去したい場合は、rstrip、lstripメソッドを使用します。次のコードでは、両側に空白のあるテキストを右、左それぞれトリミングしてprint出力しています。

```py
text = " abcdefg "

# 右側の空白を除去
r_stripped = text.rstrip()
print("*" + r_stripped + "*")

# 左側の空白を除去
l_stripped = text.lstrip()
print("*" + l_stripped + "*")
```

実行結果
* abcdefg*
*abcdefg *


文字列の大文字、小文字を変換したい

文字列のupperメソッドを使用すると、すべての文字を大文字に変換することができます。以下のコードでは、大文字小文字が混ざった文字列をすべて大文字に変換しています。

```py
text = "abcEDFghi"
upper_text = text.upper()
print(upper_text)
```

実行結果
ABCEDFGHI

lowerメソッドを使用すると小文字に変換することができます。以下のコードでは、大文字小文字が混ざった文字列をすべて小文字に変換しています。

```py
text = "abcEDFghi"
lower_text = text.lower()
print(lower_text)
```

実行結果
abcedfghi

文字列の種類を判別したい

Pythonの文字列には、is・・・・・()という判定系のメソッドが豊富に提供されています。例えば入出力チェックで文字列がASCIIであるかどうか判別したい場合、isasciiメソッドが利用できます。以下のコードでは、文字列のすべての文字がASCIIのみかどうか、10進数の数字のみかどうかを判定しています。

```py
text1 = "abc123"
text2 = "123"

# asciiのみかどうか
print(str.isascii(text1))
print(str.isascii(text2))

# 十進数の数字のみかどうか
print(str.isdecimal(text1))
print(str.isdecimal(text2))
```

実行結果
True
True
False
True

注意が必要なのが全角の扱いで、isalnum、isalpha、isdecimal、isspaceなどは全角でも条件を満たしていればTrueが返されます。次のコードは、全角文字列について判定を行っていますが、いずれもTrueとなります。

```py
print(str.isalnum("ａｂｃ１２３"))
print(str.isalpha("ａｂｃ"))
print(str.isdecimal("１２３"))
print(str.isspace("　"))    # 全角スペース
```
実行結果
True
True
True
True

また、途中になりましたが、次の投稿でテキスト処理を終了させたいと思います。


エンジニアファーストの会社　[CRE-COエンジニアリングサービス](https://www.cre-co.jp/)　H.M