Pythonの完全な句読点セット(ASCIIだけでなく)


40

私たちがよく遭遇する可能性があるすべての句読点があるリストまたはライブラリはありますか?

通常はを使用しますstring.punctuationが、次の例のように一部の句読文字は含まれていません。

>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False

これはあなたの質問に答えますか?文字列から句読点を取り除く最善の方法
空爆

9
@airstrikeいいえ。
samuelbrody1249

回答:


54

あなたはこのチェックでもっとうまくいくかもしれません:

>>> 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にあることに注意してください。必要に応じて、それらを追加するのも簡単です。


「句読点」の合理的な定義には、Unicodeの「記号」カテゴリSc(通貨など$)、Sk(修飾子など^)、Sm(数学+など<)や、So(その他©)などがあります。
dan04

3
@ dan04それが答えの最後のパラが言及しているものです。もちろん、他のユーザーは、自分のユースケースに応じて、このコードを適用して、カテゴリーを含めたり除外したりできます。
WIM

16

文字が句読点文字であるかどうかを確認したい場合は、wim投稿した答えが正しいです。

質問のタイトルが示唆するように、すべての句読文字のリストが本当に必要な場合は、以下を使用できます。

import sys
from unicodedata import category
punctuation_chars =  [chr(i) for i in range(sys.maxunicode) 
                             if category(chr(i)).startswith("P")]

2

関数を使用するようにコードを変更できる場合、wimによる答えは素晴らしいです。

ただし、in演算子を使用する必要がある場合(たとえば、ライブラリコードを呼び出す場合)、ダックタイピングを使用できます。

import unicodedata
class DuckType:
    def __contains__(self,s):
        return unicodedata.category(s).startswith("P")
punct=DuckType()
#print("'" in punct,'"' in punct,"a" in punct)

1

それは正規表現(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'
samuelbrody1249

1
@ samuelbrody1249それが機能しないとはどういう意味ですか?これはあなたの例では機能します(\xc3エスケープは句読点の除去とは関係のない表現です)。
レンツ

1
@lenz \xc3はの正しいUnicodeエンコーディングではありませんæ。入力str(text)すると、それが正しいことを確認できます\xc3\xa6。実際に\xc3は完全なコードポイントではないようです。
フェデリコポローニ

6
ああなるほど。あなたは両方ともPython 2を使用しているようですstr。UnicodeはPy2の悪夢なので、間違いなくPython 3に切り替える必要があります。私にとってstr('æ')'æ'、とascii('æ')表示され'\xe6'、正しいコードポイントであると表示されます。b'\xc3\xa6'はのUTF-8エンコーディングですが'æ'、通常はこれで作業する必要はありません。
レンツ

0

他の回答が指摘しているように、これを行う方法は、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のドキュメントを使用して、どちらかを使用する方法を理解することが期待されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.