Kompletter Satz von Satzzeichen für Python (nicht nur ASCII)


40

Gibt es eine Auflistung oder Bibliothek, die alle Satzzeichen enthält, auf die wir häufig stoßen?

Normalerweise verwende ich string.punctuation, aber einige Satzzeichen sind nicht enthalten, zum Beispiel:

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


9
@airstrike nein überhaupt nicht.
samuelbrody1249

Antworten:


54

Mit dieser Prüfung könnten Sie es besser machen:

>>> import unicodedata
>>> unicodedata.category("'").startswith("P")
True
>>> unicodedata.category("’").startswith("P")
True

Die Unicode-Kategorien P * gelten speziell für Interpunktion :

Verbinder (Pc), Strich (Pd), Anfangszitat (Pi), Endzitat (Pf), Öffnen (Ps), Schließen (Pe), Sonstiges (Po)

Verwenden Sie ein festgelegtes Verständnis, um die umfassende Sammlung vorzubereiten, die Sie anschließend für schnelle Mitgliedschaftsprüfungen verwenden können:

>>> 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

Der Zuweisungsausdruck erfordert hier Python 3.8+, was älteren Python-Versionen entspricht:

chrs = (chr(i) for i in range(sys.maxunicode + 1))
punctuation = set(c for c in chrs if category(c).startswith("P"))

Beachten Sie, dass sich einige der anderen Zeichen string.punctuationtatsächlich in der Unicode-Kategorie Symbol befinden . Es ist einfach, diese auch hinzuzufügen, wenn Sie möchten.


Eine vernünftige Definition von "Interpunktion" würde die Unicode "Symbol" -Kategorien Sc (Währung, wie $), Sk (Modifikator, wie ^), Sm (Mathematik, wie +oder <) und vielleicht So (andere, wie ©) umfassen.
dan04

3
@ dan04 Darum geht es im letzten Absatz der Antwort. Natürlich können andere diesen Code anpassen, um Kategorien abhängig von ihrem eigenen Anwendungsfall einzuschließen / auszuschließen.
wim

16

Die von wim gepostete Antwort ist korrekt, wenn Sie überprüfen möchten, ob ein Zeichen ein Interpunktionszeichen ist.

Wenn Sie wirklich eine Liste aller Satzzeichen benötigen, wie aus Ihrem Fragentitel hervorgeht, können Sie Folgendes verwenden:

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

2

Die Antwort von wim ist großartig, wenn Sie Ihren Code ändern können, um eine Funktion zu verwenden.

Wenn Sie jedoch den inOperator verwenden müssen (z. B. wenn Sie den Bibliothekscode aufrufen), können Sie die Ententypisierung verwenden:

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

Das scheint ein hübscher Job für einen regulären Ausdruck (regulärer Ausdruck) zu sein:

    import re
    text = re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE)

Hier stimmt der reguläre Ausdruck mit allen außer Leerzeichen oder Wortzeichen überein. Das Flag re.UNICODEwird verwendet, um den gesamten Satz von Unicode-Zeichen abzugleichen.


funktioniert nicht mit vielen Sprachen:>>> text="Den som dræber - fanget" >>> re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) 'Den som dr\xc3ber fanget'
samuelbrody1249

1
@ samuelbrody1249 Was meinst du damit, dass es nicht funktioniert? In Ihrem Beispiel funktioniert es (die \xc3Flucht ist eine Repräsentationssache, die nichts mit dem Entfernen der Interpunktion zu tun hat).
Lenz

1
@lenz \xc3ist nicht die richtige Unicode-Codierung von æ; Wenn Sie eingeben str(text), können Sie bestätigen, dass dies der Fall ist \xc3\xa6. Eigentlich \xc3scheint es kein vollständiger Codepunkt zu sein.
Federico Poloni

6
Oh ich verstehe. Anscheinend verwenden Sie beide Python 2, wobei stres sich um eine Byte-Zeichenfolge handelt. Sie sollten auf jeden Fall zu Python 3 wechseln, da Unicode in Py2 ein Albtraum ist. str('æ')Zeigt für mich als 'æ'und ascii('æ')zeigt als '\xe6', welches der richtige Codepunkt ist. b'\xc3\xa6'ist die UTF-8-Codierung von 'æ', aber normalerweise möchten Sie damit nicht arbeiten.
Lenz

0

Wie andere Antworten gezeigt haben, erfolgt dies über Unicode-Eigenschaften / Kategorien. Die akzeptierte Antwort greift über das Standardbibliotheksmodul auf diese Informationen zu. unicodedataAbhängig vom Kontext, in dem Sie dies benötigen, ist es möglicherweise schneller oder bequemer, mit regulären Ausdrücken auf dieselben Eigenschaftsinformationen zuzugreifen.

Allerdings ist das Standard - Bibliothek - reModul bietet keine Unicode - Unterstützung erweitert. Dazu benötigen Sie das auf PyPI ( ) verfügbare regexModulpip 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='’'>

Eine gute Übersicht über die verschiedenen Arten von Unicode - Eigenschaften , die Sie für die Verwendung von regulären Ausdrücken suchen ist vorgesehen , hier . Abgesehen von diesen zusätzlichen Funktionen für reguläre Ausdrücke, die auf der PyPI-Homepage dokumentiert sind, wird regexabsichtlich dieselbe API wie bereitgestellt. Es rewird daher erwartet, dass Sie die reDokumentation verwenden, um herauszufinden, wie eine der beiden Funktionen verwendet wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.