Czy istnieje lista lub biblioteka zawierająca wszystkie powszechnie stosowane znaki interpunkcyjne?

Zwykle używam string.punctuation, ale nie ma w nim niektórych znaków interpunkcyjnych, na przykład:

>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False
42
samuelbrody1249 2 kwiecień 2020, 06:31

5 odpowiedzi

Najlepsza odpowiedź

Możesz zrobić lepiej z tym czekiem:

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

Kategorie Unicode P * są przeznaczone specjalnie dla interpunkcji :

łącznik (Pc), myślnik (Pd), początkowy cytat (Pi), końcowy cytat (Pf), otwarty (Ps), zamknij (Pe), inny (Po)

Aby przygotować wyczerpującą kolekcję, której możesz później użyć do szybkich kontroli członkostwa, użyj zestawu ze zrozumieniem:

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

Wyrażenie przypisania tutaj wymaga Pythona 3.8+, odpowiednika starszych wersji Pythona:

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

Pamiętaj, że niektóre inne znaki w string.punctuation należą w rzeczywistości do kategorii Symbol w standardzie Unicode. Jeśli chcesz, możesz je łatwo dodać.

56
wim 3 kwiecień 2020, 18:59

Odpowiedź od wim jest świetne, jeśli możesz zmienić swój kod, aby używał funkcji.

Ale jeśli musisz użyć operatora in (na przykład wywołujesz kod biblioteki), możesz użyć pisania typu duck:

import unicodedata
class DuckType:
    def __contains__(self,s):
        return unicodedata.category(s).startswith("P")
punct=DuckType()
#print("'" in punct,'"' in punct,"a" in punct)
2
Peter Mortensen 3 kwiecień 2020, 13:36

Wydaje się, że to całkiem niezła robota dla wyrażenia regularnego (regexp):

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

Tutaj wyrażenie regularne dopasowuje wszystko oprócz białych znaków lub znaków słownych. Flaga re.UNICODE jest używana do dopasowania pełnego zestawu znaków Unicode.

1
Peter Mortensen 3 kwiecień 2020, 13:38

Odpowiedź przesłana przez wim jest poprawna, jeśli chcesz sprawdzić, czy znak jest znakiem interpunkcyjnym.

Jeśli naprawdę potrzebujesz listy wszystkich znaków interpunkcyjnych, jak sugeruje tytuł pytania, możesz użyć następujących:

import sys
from unicodedata import category
punctuation_chars =  [chr(i) for i in range(sys.maxunicode) 
                             if category(chr(i)).startswith("P")]
17
Selcuk 21 kwiecień 2020, 23:33

Jak wskazywały inne odpowiedzi, sposobem na to jest użycie właściwości / kategorii Unicode. Zaakceptowana odpowiedź umożliwia dostęp do tych informacji za pośrednictwem modułu biblioteki standardowej unicodedata, ale w zależności od kontekstu, w którym jest to potrzebne , szybsze lub wygodniejsze może być uzyskanie dostępu do tych samych informacji o właściwościach za pomocą wyrażeń regularnych.

Jednak moduł re biblioteki standardowej nie zapewnia rozszerzonego Unicode wsparcie. W tym celu potrzebujesz regex modułu, dostępnego w PyPI ({{X2} }):

>>> 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='’'>

Dobry przegląd różnych rodzajów właściwości Unicode, których można szukać za pomocą wyrażeń regularnych, znajduje się tutaj. Oprócz tych dodatkowych funkcji wyrażeń regularnych, które są udokumentowane na jego stronie głównej PyPI, regex celowo udostępnia ten sam interfejs API co re, więc oczekuje się, że użyjesz dokumentacji re, aby określić dowiedzieć się, jak używać jednego z nich.

0
dlukes 7 kwiecień 2020, 20:54