私たちがよく遭遇する可能性があるすべての句読点があるリストまたはライブラリはありますか?
通常はを使用しますstring.punctuation
が、次の例のように一部の句読文字は含まれていません。
>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False
私たちがよく遭遇する可能性があるすべての句読点があるリストまたはライブラリはありますか?
通常はを使用しますstring.punctuation
が、次の例のように一部の句読文字は含まれていません。
>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False
回答:
あなたはこのチェックでもっとうまくいくかもしれません:
>>> import unicodedata
>>> unicodedata.category("'").startswith("P")
True
>>> unicodedata.category("’").startswith("P")
True
UnicodeカテゴリP *は特に句読点用です。
コネクタ(Pc)、ダッシュ(Pd)、初期見積もり(Pi)、最終見積もり(Pf)、オープン(Ps)、クローズ(Pe)、その他(Po)
後で迅速なメンバーシップチェックに使用できる完全なコレクションを準備するには、集合内包を使用します。
>>> import sys
>>> from unicodedata import category
>>> codepoints = range(sys.maxunicode + 1)
>>> punctuation = {c for i in codepoints if category(c := chr(i)).startswith("P")}
>>> "'" in punctuation
True
>>> "’" in punctuation
True
ここでの割り当て式には、古いバージョンのPythonと同等のPython 3.8以降が必要です。
chrs = (chr(i) for i in range(sys.maxunicode + 1))
punctuation = set(c for c in chrs if category(c).startswith("P"))
の他の文字の一部は、string.punctuation
実際にはUnicodeカテゴリSymbolにあることに注意してください。必要に応じて、それらを追加するのも簡単です。
$
)、Sk(修飾子など^
)、Sm(数学+
など<
)や、So(その他©
)などがあります。
それは正規表現(regexp)のかなりの仕事のようです:
import re
text = re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE)
ここで、正規表現は、空白または単語文字を除くすべてに一致します。このフラグre.UNICODE
は、Unicode文字の完全なセットを照合するために使用されます。
>>> text="Den som dræber - fanget" >>> re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) 'Den som dr\xc3ber fanget'
\xc3
エスケープは句読点の除去とは関係のない表現です)。
\xc3
はの正しいUnicodeエンコーディングではありませんæ
。入力str(text)
すると、それが正しいことを確認できます\xc3\xa6
。実際に\xc3
は完全なコードポイントではないようです。
str
。UnicodeはPy2の悪夢なので、間違いなくPython 3に切り替える必要があります。私にとってstr('æ')
は'æ'
、とascii('æ')
表示され'\xe6'
、正しいコードポイントであると表示されます。b'\xc3\xa6'
はのUTF-8エンコーディングですが'æ'
、通常はこれで作業する必要はありません。
他の回答が指摘しているように、これを行う方法は、Unicodeのプロパティ/カテゴリを使用することです。受け入れられた回答は標準ライブラリunicodedata
モジュールを介してこの情報にアクセスしますが、必要なコンテキストによっては、正規表現を使用してこの同じプロパティ情報にアクセスする方が高速または便利な場合があります。
ただし、標準ライブラリre
モジュールは拡張Unicodeサポートを提供しません。そのためには、PyPI()で利用可能なregex
モジュールが必要ですpip install regex
。
>>> import regex as re
>>> re.match("\p{Punctuation}", "'")
<regex.Match object; span=(0, 1), match="'">
>>> re.match("\p{Punctuation}", "’")
<regex.Match object; span=(0, 1), match='’'>
ここでは、正規表現を使用して検索できるさまざまな種類のUnicodeプロパティの概要を示します。PyPIホームページに記載されているこれらの追加の正規表現機能とは別に、regex
意図的にと同じAPIを提供しているre
ため、re
のドキュメントを使用して、どちらかを使用する方法を理解することが期待されます。