अजगर के लिए विराम चिह्न का पूरा सेट (न केवल 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

यूनिकोड श्रेणी 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

यहां असाइनमेंट एक्सप्रेशन की आवश्यकता पाइथन 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वास्तव में यूनिकोड श्रेणी के प्रतीक हैं । यदि आप चाहें तो उन लोगों को जोड़ना आसान है।


"विराम चिह्न" की एक उचित परिभाषा में यूनिकोड "सिंबल" श्रेणियां Sc (मुद्रा, जैसे $), Sk (संशोधक, जैसे ^), Sm (गणित, जैसे +या <), और शायद (अन्य, जैसे ©) शामिल होंगे।
dan04

3
@ dan04 यही जवाब के आखिरी पैरा के बारे में उल्लेख है। बेशक अन्य लोग इस कोड को अपने उपयोग मामले के आधार पर श्रेणियों को शामिल / बहिष्कृत करने के लिए अनुकूलित कर सकते हैं।
अपराह्न

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का उपयोग यूनिकोड वर्णों के पूर्ण सेट से मेल खाने के लिए किया जाता है।


कई भाषाओं के साथ काम नहीं करता है:>>> 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पलायन विराम चिह्नों से संबंधित एक प्रतिनिधित्व की चीज है)।
lenz

1
@lenz \xc3का सही यूनिकोड एन्कोडिंग नहीं है æ; यदि आप लिखते str(text)हैं तो आप पुष्टि कर सकते हैं कि यह है \xc3\xa6। वास्तव में \xc3एक पूर्ण कोडपॉइंट नहीं लगता है।
फ़ेडरिको पोलोनी

6
ओह मैं समझा। ऐसा लगता है कि आप दोनों पायथन 2 का उपयोग कर रहे हैं, जहां strएक बाइट स्ट्रिंग है। आपको निश्चित रूप से पायथन 3 पर स्विच करना चाहिए, क्योंकि यूनिकोड Py2 में एक बुरा सपना है। मेरे लिए, के str('æ')रूप में दिखाता है 'æ', और के ascii('æ')रूप में दिखाता है '\xe6', जो सही कोडपॉइंट है। b'\xc3\xa6'UTF-8 की एन्कोडिंग है 'æ', लेकिन यह आमतौर पर वह नहीं है जिसके साथ आप काम करना चाहते हैं।
lenz

0

जैसा कि अन्य उत्तरों में बताया गया है, ऐसा करने का तरीका यूनिकोड के गुणों / श्रेणियों के माध्यम से है। स्वीकृत उत्तर मानक पुस्तकालय unicodedataमॉड्यूल के माध्यम से इस जानकारी तक पहुंचता है , लेकिन उस संदर्भ के आधार पर जहां आपको इसकी आवश्यकता है, नियमित अभिव्यक्ति का उपयोग करके इस समान संपत्ति की जानकारी तक पहुंचने के लिए यह तेज़ या अधिक सुविधाजनक हो सकता है।

हालाँकि, मानक लायब्रेरी reमॉड्यूल विस्तारित यूनिकोड समर्थन प्रदान नहीं करता है। उसके लिए, आपको regexमॉड्यूल की आवश्यकता है , जो PyPI पर उपलब्ध है ( 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='’'>

सभी विभिन्न प्रकार के यूनिकोड गुणों का एक अच्छा अवलोकन, जिन्हें आप नियमित अभिव्यक्ति का उपयोग करके खोज सकते हैं, यहां प्रदान किया गया है । इन अतिरिक्त नियमित अभिव्यक्ति सुविधाओं के अलावा, जो इसके PyPI मुखपृष्ठ पर प्रलेखित हैं, regexजानबूझकर वही API प्रदान करता है re, इसलिए आपसे अपेक्षा की जाती reहै कि इन दोनों में से किसी एक का उपयोग कैसे करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.