Python için eksiksiz noktalama işareti seti (sadece ASCII değil)


40

Sık karşılaşabileceğimiz tüm noktalama işaretlerini içeren bir liste veya kitaplık var mı?

Normalde kullanıyorum string.punctuation, ancak bazı noktalama işaretleri buna dahil değildir, örneğin:

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


9
@airstrike hayır hiç değil.
samuelbrody1249

Yanıtlar:


54

Bu çek ile daha iyisini yapabilirsiniz:

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

Unicode kategorileri P * özellikle Noktalama İşaretleri içindir :

konektör (Pc), kısa çizgi (Pd), ilk tırnak (Pi), son tırnak (Pf), açık (Ps), kapat (Pe), diğer (Po)

Daha sonra hızlı üyelik kontrolleri için kullanabileceğiniz kapsamlı koleksiyonu hazırlamak için belirli bir anlayış kullanın:

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

Buradaki atama ifadesi , eski Python sürümleri için eşdeğer olan Python 3.8+ gerektirir:

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

Diğer karakterlerin bazılarının string.punctuationUnicode kategorisinde olduğunu unutmayın. Symbol . İsterseniz bunları eklemek de kolaydır.


“Noktalama işaretleri” nin makul bir tanımı Unicode “Sembol” kategorileri Sc (para birimi, gibi $), Sk (değiştirici, gibi ^), Sm (matematik, gibi +veya <) ve belki de So (diğer, gibi ©) kategorilerini içerir.
dan04

3
@ dan04 Cevabın son paragrafından bahsediliyor. Tabii ki diğerleri bu kodu kendi kullanım durumlarına bağlı olarak kategorileri dahil etmek / hariç tutmak için uyarlayabilir.
wim

16

Bir karakterin noktalama işareti olup olmadığını kontrol etmek istiyorsanız wim tarafından gönderilen cevap doğrudur.

Soru başlığınızın önerdiği gibi gerçekten tüm noktalama işaretlerinin bir listesine ihtiyacınız varsa, aşağıdakileri kullanabilirsiniz:

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

2

Kodunuzu bir işlevi kullanmak için değiştirebiliyorsanız wim'in yanıtı harika.

Ancak inoperatörü kullanmanız gerekiyorsa (örneğin, kütüphane kodunu çağırıyorsunuz), ördek yazmayı kullanabilirsiniz:

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

Bu normal bir ifade (regexp) için güzel bir iş gibi görünüyor:

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

Burada, normal ifade boşluk veya kelime karakterleri hariç her şeyle eşleşiyor. Bayrak re.UNICODE, tüm Unicode karakter kümesiyle eşleşmek için kullanılır.


birçok dilde çalışmıyor:>>> text="Den som dræber - fanget" >>> re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) 'Den som dr\xc3ber fanget'
samuelbrody1249

1
@ samuelbrody1249 Ne demek çalışmıyor? Örneğinizde işe yarıyor ( \xc3kaçış, noktalama işaretlerinin çıkarılmasıyla ilgisiz bir temsil şeyidir).
lenz

1
@lenz \xc3doğru Unicode kodlaması değil æ; yazarsanız str(text)bunun olduğunu onaylayabilirsiniz \xc3\xa6. Aslında \xc3tam bir kod noktası gibi görünmüyor.
Federico Poloni

6
Ah anlıyorum. İkinizin strde bir bayt dizesi olan Python 2'yi kullandığınız anlaşılıyor . Kesinlikle Python 3'e geçmelisiniz, çünkü Unicode Py2'de bir kabus. Benim için str('æ')olduğu gibi gösterileri 'æ've ascii('æ')gösteriler olarak '\xe6'doğru codepoint olan. b'\xc3\xa6'UTF-8 kodlamasıdır 'æ', ancak bu genellikle çalışmak istediğiniz şey değildir.
lenz

0

Diğer cevapların da işaret ettiği gibi, bunu yapmanın yolu Unicode özellikleri / kategorileridir. Kabul edilen cevap, bu bilgiye standart kütüphane unicodedatamodülü aracılığıyla erişir , ancak buna ihtiyaç duyduğunuz bağlama bağlı olarak, aynı özellik bilgilerine normal ifadeler kullanarak erişmek daha hızlı veya daha uygun olabilir.

Ancak, standart kitaplık remodülü genişletilmiş Unicode desteği sağlamaz. Bunun için , PyPI ( ) üzerinde bulunan regexmodüle ihtiyacınız vardır 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='’'>

Normal ifadeleri kullanarak arayabileceğiniz tüm farklı Unicode özelliklerine iyi bir genel bakış burada sunulmaktadır . PyPI ana sayfasında belgelenen bu ekstra düzenli ifade özelliklerinin yanı sıra, regexkasıtlı olarak aynı API'yı sağlar re, bu nedenle reikisinden birini nasıl kullanacağınızı anlamak için belgelerini kullanmanız beklenir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.