Você pode fazer melhor com esta verificação:
>>> import unicodedata
>>> unicodedata.category("'").startswith("P")
True
>>> unicodedata.category("’").startswith("P")
True
As categorias Unicode P * são especificamente para pontuação :
conector (Pc), traço (Pd), cotação inicial (Pi), cotação final (Pf), aberto (Ps), fechado (Pe), outro (Po)
Para preparar a coleção completa, que você pode usar posteriormente para verificações rápidas de associação, use uma compreensão definida:
>>> 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
A expressão de atribuição aqui requer Python 3.8+, equivalente às versões mais antigas do Python:
chrs = (chr(i) for i in range(sys.maxunicode + 1))
punctuation = set(c for c in chrs if category(c).startswith("P"))
Cuidado para que alguns dos outros caracteres string.punctuation
estejam realmente na categoria Unicode Symbol . É fácil adicioná-los também, se você quiser.