[Python] Punctuationの一括削除

punctuationとは、記号文字列のことです。

str.translate() を使う方法と、正規表現を使う方法で行ってみます。

str.translate() を使うPunctuationの削除

str.translate()を使い、Punctuation を一括で削除します。

str.translate() は、ある文字列内の複数の文字列を一括で変換する関数で、 str.translate() を使わない場合よりも高速に変換を行うことができます。

文字の変換にはstr.translate()が便利

Punctuationの取得

Pythonでは、string.punctuationで、まとめて取得することができます。


string.punctuation
C ロケールにおいて、句読点として扱われる ASCII 文字の文字列です。


https://docs.python.org/ja/3.7/library/string.html#string.punctuation

コンソールで確認すると、 string.punctuationには、以下の文字列が含まれています。

>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

str.maketrans()

まず、str.maketrans() で、変換のためのテーブルを作ります。


static str.maketrans(x[, y[, z]])
この静的メソッドは str.translate() に使える変換テーブルを返します。
引数を 1 つだけ与える場合、それは Unicode 序数 (整数) または文字 (長さ 1 の文字列) を、Unicode 序数、(任意長の) 文字列、または None に対応づける辞書でなければなりません。このとき、文字で指定したキーは序数に変換されます。
引数を 2 つ指定する場合、それらは同じ長さの文字列である必要があり、結果の辞書では、x のそれぞれの文字が y の同じ位置の文字に対応付けられます。第 3 引数を指定する場合、文字列を指定する必要があり、それに含まれる文字が None に対応付けられます。


https://docs.python.org/ja/3/library/stdtypes.html#str.maketrans

今回は削除するだけなので、第3引数を指定します。

table = str.maketrans("", "", string.punctuation)

str.translate()

str.translate()で、文字列を処理します。


str.translate(table)
与えられた変換テーブルに基づいて文字列を構成する各文字をマッピングし、マッピング後の文字列のコピーを返します


https://docs.python.org/ja/3/library/stdtypes.html#str.translate

str.maketrans() で作成したテーブルを str.translate()に渡すことで、文中のpunctuationをまとめて削除してくれます。

下の例では、”Dammit I’m mad.”という文章を、’dammitimmad’に変換しています。

ついでに、replace()でスペースを削除して、lowercase()小文字にしています。

>>> import string
>>> s = "Dammit I'm mad."
>>> table = str.maketrans("", "", string.punctuation)
>>> s = s.translate(table)
>>> s = s.replace(" ", "")
>>> s
'DammitImmad'
>>> s = s.lower()
>>> s
'dammitimmad'
>>>

正規表現を使うPunctuationの削除

正規表現を使うことで、文字数字以外を空文字に変換します。

re — 正規表現操作

\w[a-zA-Z0-9_]に、\W [^a-zA-Z0-9_]  に相当します。

_ のみ数字文字に含まれるので、こちらは別に削除します。

>>> import re
>>> s = "Dammit I'm mad."
>>> s = re.sub(r'[\W]', '', s)
>>> s = re.sub(r'\_', '', s)
>>> s
'DammitImmad'
>>> s = s.lower()
>>> s
'dammitimmad'

上と同様の結果になりました。