Skip to content
This page has been auto-translated and may contain errors.View in English

स्ट्रिंग्स

टेक्स्ट लगभग हर प्रोग्राम में दिखाई देता है जो आप लिखते हैं। नाम, संदेश, स्कोर, लेबल। Python में, टेक्स्ट के किसी भी टुकड़े को string कहा जाता है: कोई भी मान जिसे आप उद्धरण चिह्नों में लपेटते हैं। सिंगल हो या डबल, दोनों एक ही तरह से काम करते हैं।

स्ट्रिंग्स Python का प्राथमिक टेक्स्ट प्रकार है। ये उपयोगकर्ता नाम से लेकर URL पथ तक से लेकर फॉर्मेटेड आउटपुट तक सब कुछ रखते हैं। सिंगल और डबल उद्धरण समान परिणाम देते हैं; चुनाव शैलीगत है।

str Python का अपरिवर्तनीय (immutable) Unicode अनुक्रम प्रकार है। यह हर सिस्टम सीमा पर बैठता है: टर्मिनल I/O, फ़ाइल सामग्री, नेटवर्क प्रतिक्रियाएँ, सीरियलाइज्ड डेटा। दोनों उद्धरण शैलियाँ एक ही ऑब्जेक्ट उत्पन्न करती हैं; टोकनाइज़र उन्हें समान रूप से व्यवहार करता है।

python
greeting = "Hello, world"
username = 'alice'

केवल तभी उद्धरण का चुनाव मायने रखता है जब आपके टेक्स्ट में उद्धरण चिह्न हों। विपरीत शैली का उपयोग करें ताकि आपको उन्हें एस्केप न करना पड़े:

समुदाय परंपरा डबल उद्धरण है। शैली बदलने का व्यावहारिक कारण यह है कि जब सामग्री में वह वर्ण हो तो एस्केपिंग से बचा जा सके:

परंपरा डबल उद्धरण है। शैली बदलने का एकमात्र कारण बैकस्लैश एस्केप से बचना है जब सामग्री में वह डिलीमिटर हो:

python
note    = "It's a great day"      # अंदर apostrophe है, डबल उद्धरण उपयोग करें
message = 'She said "hello"'      # अंदर डबल उद्धरण हैं, सिंगल उद्धरण उपयोग करें
escaped = "She said \"hello\""    # या बैकस्लैश से एस्केप करें

अपरिवर्तनीयता (Immutability)

स्ट्रिंग्स अपरिवर्तनीय हैं: एक बार जब आप एक बनाते हैं, तो आप इसे बदल नहीं सकते। एक स्ट्रिंग को उसके बनने के क्षण से स्थायी रूप से तय समझें। कोई भी ऑपरेशन जो स्ट्रिंग को संशोधित करता हुआ दिखता है, वास्तव में एक बिल्कुल नया उत्पन्न कर रहा होता है। मूल बिल्कुल वैसा ही रहता है।

स्ट्रिंग्स अपरिवर्तनीय हैं: कोई भी मेथड स्ट्रिंग को जगह पर संशोधित नहीं करता। प्रत्येक ऑपरेशन जो टेक्स्ट को रूपांतरित करता है, एक नई स्ट्रिंग लौटाता है और मूल को अछूता छोड़ देता है। व्यावहारिक परिणाम यह है कि एक मेथड कॉल जिसे आप कहीं असाइन नहीं करते, उसका किसी भी चीज़ पर कोई प्रभाव नहीं होता।

str ऑब्जेक्ट अपरिवर्तनीय हैं: आंतरिक बफर निर्माण के समय तय हो जाता है और इसमें लिखा नहीं जा सकता। यह स्ट्रिंग्स को तीन उपयोगी गुण देता है: ये हैशेबल हैं (dict कुंजियों और set सदस्यों के रूप में मान्य), संदर्भों के बीच बिना कॉपी किए साझा करने के लिए सुरक्षित हैं, और छोटे लिटरल्स पर CPython के इंटर्निंग ऑप्टिमाइज़ेशन के योग्य हैं।

python
name = "alice"
name = name.upper()   # "ALICE" एक नई स्ट्रिंग है; "alice" अपरिवर्तित है

प्रत्यक्ष परिणाम: आप किसी विशिष्ट स्थिति पर वर्ण नहीं बदल सकते। यदि आप कोशिश करते हैं तो Python एक त्रुटि उठाएगा।

python
name = "alice"
name[0] = "A"   # TypeError: 'str' object does not support item assignment

संशोधित स्ट्रिंग प्राप्त करने के लिए, स्लाइसिंग या मेथड का उपयोग करके एक नई बनाएं। दोनों नीचे कवर हैं।

वर्ण असाइनमेंट का प्रयास सीधे बाधा दिखाता है:

python
name = "alice"
name[0] = "A"   # TypeError: 'str' object does not support item assignment

जब आपको संशोधित संस्करण की आवश्यकता होती है, तो मानक उपकरण हैं: स्थानात्मक संपादन के लिए concatenation के साथ स्लाइसिंग, और प्रतिस्थापन के लिए replace()। दोनों एक नई स्ट्रिंग उत्पन्न करते हैं और मूल को अछूता छोड़ देते हैं।

str.__setitem__ लागू नहीं है; आइटम असाइनमेंट बिना शर्त TypeError उठाता है। स्थानात्मक संशोधन के लिए, स्लाइसिंग का उपयोग करें: name[:1].upper() + name[1:]। प्रतिस्थापन के लिए, replace()। कई टुकड़ों को इकट्ठा करने के लिए, "".join(parts) महत्वपूर्ण है: एक लूप के अंदर बार-बार s += chunk O(n²) है क्योंकि प्रत्येक + संयुक्त लंबाई का एक नया बफर आवंटित करता है और दोनों ऑपरेंड्स को कॉपी करता है। join() एक बार आवंटित करता है।

इंडेक्सिंग और स्लाइसिंग

एक स्ट्रिंग में प्रत्येक वर्ण की एक क्रमांकित स्थिति होती है, जो शून्य से शुरू होती है। आप उस स्थिति संख्या को वर्गाकार कोष्ठक में रखकर अलग-अलग वर्ण पढ़ सकते हैं। ऋणात्मक संख्याएँ अंत से पीछे की ओर गिनती करती हैं।

स्ट्रिंग्स शून्य-आधारित इंडेक्सिंग वाले अनुक्रम हैं। ऋणात्मक इंडेक्स अंत से गिनती करते हैं। स्लाइसिंग एक एकल अभिव्यक्ति में किसी भी सन्निहित श्रेणी को निकालता है, और यह कभी भी सीमा से बाहर के मानों पर त्रुटि नहीं उठाता।

str पूर्ण अनुक्रम प्रोटोकॉल लागू करता है। सबस्क्रिप्ट एक्सेस (s[i]) एक integer के साथ __getitem__ से गुजरता है और सीमा से बाहर इनपुट पर IndexError उठाता है। स्लाइसिंग (s[start:stop:step]) एक slice ऑब्जेक्ट पास करता है; इंडेक्स चुपचाप मान्य सीमा में क्लैंप किए जाते हैं, इसलिए स्लाइस से कोई IndexError संभव नहीं है।

python
word = "Python"
#       012345

print(word[0])    # "P"
print(word[2])    # "t"
print(word[5])    # "n"
print(word[-1])   # "n"  (अंतिम वर्ण)
print(word[-2])   # "o"  (अंत से दूसरा)

-1 हमेशा अंतिम वर्ण होता है, -2 अंत से दूसरा, और इसी तरह। ये तब उपयोगी होते हैं जब आप स्ट्रिंग की सटीक लंबाई जाने बिना उसका अंत चाहते हैं।

ऋणात्मक इंडेक्स लपेटे जाते हैं: -1 है len(s) - 1, -2 है len(s) - 2। सबसे उपयोगी एंड-एंकर्ड एक्सेस के लिए जब आप मैन्युअल रूप से लंबाई गणना नहीं करना चाहते। एक ऋणात्मक इंडेक्स जो सीमा से बाहर जाता है, फिर भी IndexError उठाता है, सकारात्मक की तरह।

बाउंड्स चेक से पहले ऋणात्मक इंडेक्स को len(s) + i पर सामान्यीकृत किया जाता है। इंटरप्रेटर में कोई विशेष-केसिंग नहीं है; यह अंकगणित है। चिह्न की परवाह किए बिना सीमा से बाहर IndexError उठाता है।

स्लाइसिंग एक हिस्सा निकालता है। [start:stop] में start शामिल है और stop बाहर है:

python
word = "Python"

print(word[0:2])   # "Py"     (स्थान 0 और 1)
print(word[2:])    # "thon"   (स्थान 2 से अंत तक)
print(word[:3])    # "Pyt"    (शुरू से स्थान 2 तक)
print(word[:])     # "Python" (पूरी स्ट्रिंग की एक प्रति)
print(word[::2])   # "Pto"    (हर दूसरा वर्ण)
print(word[::-1])  # "nohtyP" (उल्टा)

सबसे अधिक उपयोग किए जाने वाले तीन पैटर्न: पहले n वर्णों के लिए word[:n], स्थान n से आगे सब कुछ के लिए word[n:], अंतिम n वर्णों के लिए word[-n:]word[::-1] एक स्ट्रिंग को उल्टा करता है। यह पहली बार अजीब लगता है, लेकिन यह मुहावरेदार Python है और आप इसे अक्सर देखेंगे।

प्रत्यक्ष इंडेक्सिंग के विपरीत, स्लाइसिंग कभी भी IndexError नहीं उठाता। Python चुपचाप सीमा से बाहर इंडेक्स को क्लैंप करता है, इसलिए एक छोटी स्ट्रिंग पर word[100:] क्रैश होने के बजाय "" लौटाता है। step तर्क stride को नियंत्रित करता है: word[::2] हर दूसरा वर्ण लेता है, word[::-1] उल्टे क्रम में चलता है।

s[start:stop:step] slice(start, stop, step) को __getitem__ पर पास करता है। तीनों तर्क डिफ़ॉल्ट रूप से None हैं, 0 और len() नहीं। ऋणात्मक step के साथ, डिफ़ॉल्ट उलट जाते हैं: start डिफ़ॉल्ट रूप से len - 1 हो जाता है, stop -(len + 1)। यही [::-1] को बिना किसी स्पष्ट सीमा के पूरी स्ट्रिंग को उल्टे क्रम में चलाता है।

आवश्यक स्ट्रिंग मेथड्स

स्ट्रिंग्स के साथ अंतर्निहित मेथड्स का एक सेट आता है: ऑपरेशन जो आप किसी भी स्ट्रिंग मान पर सीधे कॉल करते हैं। आप स्ट्रिंग (या वेरिएबल जो इसे रखता है) लिखते हैं, फिर एक डॉट, फिर मेथड का नाम। प्रत्येक मेथड एक नई स्ट्रिंग लौटाता है। मूल कभी नहीं बदला जाता।

स्ट्रिंग मेथड्स str प्रकार से जुड़े फ़ंक्शन हैं। चूंकि स्ट्रिंग्स अपरिवर्तनीय हैं, हर मेथड मूल को संशोधित करने के बजाय एक नई स्ट्रिंग लौटाता है। एक मेथड कॉल जिसे आप कहीं असाइन या पास नहीं करते, उसका कोई स्थायी प्रभाव नहीं होता।

str के मेथड्स type ऑब्जेक्ट पर परिभाषित हैं और C में लागू किए गए हैं। सभी रूपांतरण मेथड्स अपरिवर्तनीयता अनुबंध का पालन करते हैं: वे नए str ऑब्जेक्ट लौटाते हैं। CPython का कार्यान्वयन पूरी तरह Unicode-aware है; मेथड्स बाइट्स पर नहीं, कोड पॉइंट्स पर काम करते हैं।

केस

python
text = "Hello, World"

text.lower()       # "hello, world"
text.upper()       # "HELLO, WORLD"
text.title()       # "Hello, World"  (प्रत्येक शब्द कैपिटलाइज़्ड)
text.capitalize()  # "Hello, world"  (केवल पहला शब्द)

lower() और upper() दो हैं जिनका आप सबसे अधिक उपयोग करेंगे। lower() विशेष रूप से तब उपयोगी होता है जब टेक्स्ट की तुलना की जाती है: "Alice" और "alice" एक ही चीज़ बन जाते हैं जब आप दोनों ओर .lower() कॉल करते हैं।

lower() तुलना या भंडारण से पहले मानक सामान्यीकरण कदम है। title() एक सरल नियम का उपयोग करके प्रत्येक शब्द के पहले अक्षर को कैपिटलाइज़ करता है जो संकुचनों पर गलत हो जाता है: "it's" "It'S" बन जाता है। इसे केवल-प्रदर्शन फॉर्मेटिंग के रूप में मानें।

lower() Unicode पूर्ण केस रूपांतरण लागू करता है। केस-असंवेदनशील तुलना के लिए, casefold() अधिक सही है: यह अतिरिक्त रूपांतरण लागू करता है (जैसे जर्मन ß ss बन जाता है) जो lower() छोड़ देता है। title() किसी भी गैर-वर्णांकीय वर्ण के बाद कैपिटलाइज़ करता है, जो संकुचनों और हाइफनयुक्त नामों को गलत संभालता है। सही टाइटल केसिंग के लिए, लॉजिक को मैन्युअल रूप से लागू करें।

व्हाइटस्पेस

python
text = "  hello  "

text.strip()    # "hello"    (दोनों ओर)
text.lstrip()   # "hello  "  (केवल बाएँ)
text.rstrip()   # "  hello"  (केवल दाएँ)

strip() एक स्ट्रिंग के दोनों सिरों से रिक्त स्थान हटाता है। आप इसका उपयोग लगभग हर बार करेंगे जब आप उपयोगकर्ता इनपुट या फ़ाइल से टेक्स्ट संभालते हैं, क्योंकि बेकार के रिक्त स्थान मूक विफलताओं का कारण बनते हैं: "alice" != "alice "

strip() सभी प्रमुख और अनुगामी व्हाइटस्पेस हटाता है: स्पेस, टैब, और न्यूलाइन। दिशात्मक वैरिएंट आपको केवल एक ओर साफ़ करने देते हैं, इंडेंटेशन को छुए बिना अनुगामी न्यूलाइन हटाने के लिए उपयोगी। तीनों एक वैकल्पिक characters तर्क स्वीकार करते हैं ताकि विशिष्ट वर्णों को हटाया जा सके।

बिना तर्क के strip() उन वर्णों को हटाता है जिनके लिए str.isspace() True लौटाता है, एक Unicode-aware सेट जिसमें गैर-ASCII व्हाइटस्पेस शामिल है। एक character तर्क के साथ, यह उस सेट में किसी भी वर्ण को दोनों सिरों से हटाता है (एक वर्ण सदस्यता जाँच, उपसर्ग मिलान नहीं)। "xxhelloxx".strip("x") "hello" लौटाता है। बहु-वर्ण तर्क उन वर्णों में से किसी को भी अलग-अलग हटाते हैं, जो सूक्ष्म बग्स का एक सामान्य स्रोत है।

खोजना

python
text = "Hello, world"

text.find("world")         # 7
text.find("Python")        # -1  (नहीं मिला)
text.count("l")            # 3
text.startswith("Hello")   # True
text.endswith("world")     # True

find() वह स्थिति लौटाता है जहाँ आपकी स्ट्रिंग के अंदर टेक्स्ट का एक टुकड़ा शुरू होता है। यदि यह वहाँ नहीं है, तो यह -1 लौटाता है। startswith() और endswith() का उपयोग करें जब आप केवल इस बारे में परवाह करते हैं कि स्ट्रिंग कुछ विशिष्ट से शुरू या समाप्त होती है या नहीं।

find() पहले मैच का प्रारंभ इंडेक्स लौटाता है, या -1-1 परंपरा आपको परिणाम का सीधे स्लाइसिंग या अंकगणित में बिना जाँच के उपयोग करने देती है। startswith() और endswith() प्रत्येक स्ट्रिंग्स का एक tuple स्वीकार करते हैं, जिससे एक कॉल में कई उपसर्गों या प्रत्ययों का परीक्षण करना आसान हो जाता है।

find() बाएँ से दाएँ रैखिक स्कैन है, सबसे खराब स्थिति में O(n*m)। index() समान है लेकिन कोई मैच न होने पर ValueError उठाता है: index() का उपयोग करें जब अनुपस्थिति एक प्रोग्रामिंग त्रुटि है, find() जब यह अपेक्षित इनपुट है। startswith() और endswith() पहले बेमेल पर शॉर्ट-सर्किट करते हैं और उपसर्ग/प्रत्यय परीक्षणों के लिए find() या in जाँच की तुलना में तेज़ हैं।

प्रतिस्थापन

python
text = "Hello, world"

text.replace("world", "Python")   # "Hello, Python"
text.replace("l", "L")            # "HeLLo, worLd"  (सभी घटनाएँ)
text.replace("l", "L", 1)         # "HeLlo, world"  (केवल पहली)

replace() टेक्स्ट के एक टुकड़े की हर घटना को दूसरे से बदल देता है और आपको एक नई स्ट्रिंग वापस देता है। मूल नहीं बदला जाता। यदि आप केवल पहली घटना को बदलना चाहते हैं तो एक तीसरा तर्क पास करें।

replace() डिफ़ॉल्ट रूप से सभी गैर-अतिव्यापी घटनाओं को बदल देता है। count तर्क सीमित करता है कि कितने बदले जाते हैं। चूंकि यह एक नई स्ट्रिंग लौटाता है, कॉल्स को chain किया जा सकता है: text.replace("a", "A").replace("e", "E") दोनों प्रतिस्थापनों को क्रम में लागू करता है।

replace() एक लिटरल सबस्ट्रिंग स्कैन करता है और जब कोई count नहीं दिया जाता है तो एक एकल आवंटन में परिणाम बनाता है; count के साथ यह जल्दी रुकता है। पैटर्न-आधारित प्रतिस्थापन के लिए, Python का re मॉड्यूल सही उपकरण है। यह Modules अध्याय में कवर किया गया है।

विभाजन और जुड़ाव

split() एक स्ट्रिंग को एक विभाजक पर टुकड़ों में काटता है और उन्हें एक list के रूप में लौटाता है। आप इसे बताते हैं कि किस पर काटना है:

split() एक विभाजक पर विभाजित करता है और खंडों को एक list के रूप में लौटाता है। बिना तर्क के कॉल किया गया, यह किसी भी व्हाइटस्पेस रन पर विभाजित होता है और लगातार कई स्पेस से खाली स्ट्रिंग्स को त्याग देता है:

split(sep) बाएँ से दाएँ स्कैन करता है, sep की हर गैर-अतिव्यापी घटना पर विभाजित होता है। बिना तर्क के यह एक अलग एल्गोरिथम का उपयोग करता है: यह व्हाइटस्पेस के किसी भी रन पर विभाजित होता है और परिणाम से अग्रणी और अनुगामी व्हाइटस्पेस हटाता है। rsplit(sep, n) दाएँ से विभाजित करता है, डॉटेड पथ या नेमस्पेस्ड पहचानकर्ता के अंतिम खंड को अलग करने के लिए उपयोगी:

python
csv_row = "आरव,28,नई दिल्ली"
parts = csv_row.split(",")     # ["आरव", "28", "नई दिल्ली"]

"  hello   world  ".split()   # ["hello", "world"]

List क्या है?

List मानों का एक क्रमबद्ध संग्रह है। ऊपर ["आरव", "28", "नई दिल्ली"] एक है। Lists को अपना अलग अध्याय मिलता है; अभी के लिए, उन्हें वस्तुओं के अनुक्रम के रूप में मानें जो split() उत्पन्न करता है और join() खपत करता है।

join() विपरीत करता है: यह स्ट्रिंग्स की एक list को एक में जोड़ता है। .join() से पहले की स्ट्रिंग प्रत्येक आइटम के बीच रखी जाती है:

python
words = ["Hello", "world"]

" ".join(words)    # "Hello world"
", ".join(words)   # "Hello, world"
"".join(words)     # "Helloworld"

याद रखने का पैटर्न: separator.join(list_of_strings)। विभाजक बाईं ओर जाता है, list दाईं ओर। " ".join(words) प्रत्येक शब्द के बीच एक स्पेस रखता है। "".join(words) उन्हें बिना कुछ बीच में जोड़ देता है।

join() सही उपकरण है जब भी आप कई टुकड़ों से एक एकल स्ट्रिंग इकट्ठा कर रहे हों। यह प्रत्येक चरण पर एक नई स्ट्रिंग बनाने के बजाय एक एकल आवंटन करता है। दो या तीन स्ट्रिंग्स के लिए, + बिल्कुल ठीक है। एक बार जब आपके पास किसी भी महत्वपूर्ण आकार की list हो, तो join() के लिए पहुँचें।

join() O(n) है: यह __iter__ को एक बार कॉल करता है, एक पास में आवश्यक कुल लंबाई की गणना करता है, एक एकल आवंटन करता है, फिर प्रत्येक टुकड़े और विभाजक को सीधे बफर में लिखता है। बार-बार + O(n²) है: प्रत्येक ऑपरेशन संयुक्त लंबाई का एक नया बफर आवंटित करता है और दोनों ऑपरेंड्स को कॉपी करता है। CPython में एक एकल लोकल वेरिएबल पर बार-बार += के लिए एक सीमित ऑप्टिमाइज़ेशन है, लेकिन यह रिफैक्टर्स के बीच नाजुक है और गारंटीकृत नहीं है। join() हमेशा सही और हमेशा तेज़ है।

f-strings

f-strings मानों को सीधे टेक्स्ट के अंदर एम्बेड करती हैं। शुरुआती उद्धरण से पहले f रखें, फिर किसी भी वेरिएबल या अभिव्यक्ति को घुंघराले कोष्ठक में लपेटें। कोड चलने पर Python इसे भर देता है। आप मान के बाद एक कोलन भी जोड़ सकते हैं ताकि यह नियंत्रित किया जा सके कि इसे कैसे प्रदर्शित किया जाए।

f-strings रनटाइम पर {} के अंदर किसी भी अभिव्यक्ति का मूल्यांकन करती हैं और परिणाम को एक स्ट्रिंग में परिवर्तित करती हैं। कोष्ठक के अंदर एक कोलन एक format spec पेश करता है: दशमलव स्थानों, संरेखण, और संख्या फॉर्मेटिंग को नियंत्रित करने के लिए एक संक्षिप्त सिंटैक्स।

f-strings (PEP 498) प्रत्येक {} अभिव्यक्ति को बाइटकोड में कंपाइल करती हैं जो format(value, spec) को कॉल करता है, जो value.__format__(spec) को सौंपता है। कोई भी क्लास जो __format__ लागू करती है, f-string के अंदर अपना डिस्प्ले नियंत्रित करती है। रूपांतरण फ़्लैग !r, !s, !a format कॉल से पहले repr(), str(), या ascii() लागू करते हैं।

python
name  = "आरव"
score = 94.5

print(f"Hello, {name}!")           # "Hello, आरव!"
print(f"Score: {score:.1f}%")      # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}")          # "2 + 2 = 4"
print(f"Name: {name.upper()}")     # "Name: आरव"

: के बाद का format spec नियंत्रित करता है कि मान कैसे प्रदर्शित होता है:

Specअर्थउदाहरण
.2f2 दशमलव स्थानf"{3.14159:.2f}""3.14"
.0%प्रतिशत, कोई दशमलव नहींf"{0.94:.0%}""94%"
,हजारों विभाजकf"{1000000:,}""1,000,000"
>1010 वर्णों में दाएँ-संरेखितf"{'hi':>10}"" hi"

आप .2f का सबसे अधिक उपयोग करेंगे: किसी भी समय जब आप एक दशमलव प्रदर्शित करते हैं और अंकों के एक लंबे रन के बजाय एक साफ-सुथरी संख्या चाहते हैं। तालिका में बाकी सब कुछ तब है जब आपको इसकी आवश्यकता हो। आप {} के अंदर कोई भी वेरिएबल, अंकगणित, या मेथड कॉल रख सकते हैं।

.2f और .0% अधिकांश डिस्प्ले फॉर्मेटिंग को कवर करते हैं। संरेखण विनिर्देशक (>, <, ^) चौड़ाई के साथ संयुक्त होने पर सारणीबद्ध आउटपुट उत्पन्न करते हैं। सामान्य पैटर्न है {value:[align][width][.precision][type]}। एक बार जब आप टुकड़ों को पहचान लेते हैं, तो सभी संयोजनों को याद किए बिना कोई भी spec पठनीय हो जाता है।

spec को __format__ को शब्दशः पास किया जाता है; अंतर्निहित प्रकार इसे C में संभालते हैं। !r सबसे उपयोगी रूपांतरण फ़्लैग है: यह फॉर्मेटिंग से पहले repr() कॉल करता है, जो स्ट्रिंग्स के चारों ओर उद्धरण जोड़ता है और अदृश्य वर्णों (टैब, अनुगामी रिक्त स्थान, न्यूलाइन) को एस्केप अनुक्रमों के रूप में दृश्यमान बनाता है। कस्टम क्लासेस __format__ को मनमाने spec स्ट्रिंग्स स्वीकार करने और कोई भी आउटपुट उत्पन्न करने के लिए लागू कर सकती हैं।

मल्टीलाइन स्ट्रिंग्स

एक स्ट्रिंग लिखने के लिए जो एक से अधिक पंक्ति में फैली हो, ट्रिपल उद्धरण चिह्नों का उपयोग करें: शुरू में तीन " और अंत में तीन। Python सभी लाइन ब्रेक्स और स्पेसिंग को ठीक वैसे ही संरक्षित करता है जैसा आपने लिखा है।

ट्रिपल-उद्धृत स्ट्रिंग्स सभी व्हाइटस्पेस और लाइन ब्रेक्स को शाब्दिक रूप से संरक्षित करती हैं। ये लंबे टेक्स्ट ब्लॉक्स जैसे ईमेल टेम्पलेट्स और SQL क्वेरीज़ के लिए मानक हैं, और docstrings के लिए: एक फ़ंक्शन या क्लास बॉडी की शुरुआत में रखा गया इनलाइन दस्तावेज़ीकरण।

ट्रिपल-उद्धृत लिटरल्स सभी वर्णों को शब्दशः संरक्षित करते हैं, जिसमें प्रत्येक पंक्ति पर अग्रणी व्हाइटस्पेस शामिल है। जब एक फ़ंक्शन, क्लास, या मॉड्यूल बॉडी में पहले स्टेटमेंट के रूप में उपयोग किया जाता है, तो Python स्ट्रिंग को उस ऑब्जेक्ट के __doc__ विशेषता के रूप में संग्रहीत करता है। help() जैसे उपकरण इसे प्रदर्शित करते हैं; अग्रणी व्हाइटस्पेस आमतौर पर textwrap.dedent() द्वारा हटा दिया जाता है। ट्रिपल ''' और """ समतुल्य हैं; """ परंपरा है।

python
message = """
प्रिय आरव,

आपके ऑर्डर के लिए धन्यवाद।

सादर,
टीम
"""

एस्केप अनुक्रम

कुछ वर्ण एक स्ट्रिंग के अंदर सीधे टाइप करना कठिन होता है। Python एस्केप अनुक्रमों का उपयोग करता है: एक बैकस्लैश के बाद एक अक्षर जो किसी चीज़ का प्रतिनिधित्व करता है। दो जिनका आप लगातार उपयोग करेंगे वे हैं नई पंक्ति के लिए \n और टैब के लिए \t

एस्केप अनुक्रम आपको ऐसे वर्ण एम्बेड करने देते हैं जो अन्यथा सिंटैक्स तोड़ देंगे या सीधे टाइप नहीं किए जा सकते। जिनकी आप तलाश करेंगे: \n (newline), \t (tab), \\ (एक लिटरल बैकस्लैश), \" और \' (मिलान-डिलीमिटर स्ट्रिंग के अंदर उद्धरण)। Windows पथों को बैकस्लैश की आवश्यकता होती है, जो एस्केप प्रोसेसिंग से टकराते हैं। इसे अक्षम करने के लिए r के साथ उपसर्ग करें।

Python C-शैली एस्केप सेट प्लस Unicode एस्केप्स का समर्थन करता है: \uXXXX (16-बिट कोड पॉइंट), \UXXXXXXXX (32-बिट), \xNN (हेक्स बाइट मान), \N{name} (नामित Unicode वर्ण)। रॉ स्ट्रिंग लिटरल्स (r"...") सभी एस्केप प्रोसेसिंग को दबा देते हैं, प्रत्येक बैकस्लैश को स्ट्रिंग के माध्यम से शब्दशः पास करते हैं। यह Windows पथों और नियमित अभिव्यक्तियों के लिए आवश्यक है, जहाँ बैकस्लैश Python के टोकनाइज़र के बजाय उपभोक्ता के लिए अर्थ रखते हैं।

अनुक्रमवर्ण
\nNewline
\tTab
\\लिटरल बैकस्लैश
\"डबल उद्धरण
\'सिंगल उद्धरण
python
print("Line one\nLine two")        # आउटपुट की दो पंक्तियाँ
print("Name:\tAlice")              # Name:   Alice
path = r"C:\Users\Alice\Documents" # raw स्ट्रिंग, कोई एस्केप प्रोसेसिंग नहीं

स्ट्रिंग सामग्री की जाँच

Python के पास ऐसे मेथड्स हैं जो हाँ/नहीं प्रश्नों का उत्तर देते हैं कि एक स्ट्रिंग में क्या है। वे True या False लौटाते हैं। शुरू में सबसे उपयोगी: isdigit() आपको यह जाँचने देता है कि क्या एक स्ट्रिंग केवल संख्याएँ हैं इसे परिवर्तित करने से पहले, ताकि आप अप्रत्याशित इनपुट पर क्रैश से बच सकें।

is* मेथड्स प्रत्येक संपूर्ण स्ट्रिंग की एक विशिष्ट संपत्ति का परीक्षण करते हैं और केवल तभी True लौटाते हैं यदि हर वर्ण शर्त को पूरा करता है। उनका मुख्य उपयोग इनपुट सत्यापन है: परिवर्तित करने से पहले जाँच करें ताकि अप्रत्याशित इनपुट पर क्रैश से बचा जा सके। int() से पहले isdigit() क्लासिक पैटर्न है।

is* मेथड्स ASCII श्रेणियों के बजाय Unicode श्रेणी जाँच का उपयोग करते हैं। isdigit() 0-9 से परे superscript अंकों और अन्य संख्यात्मक Unicode कोड पॉइंट्स के लिए True लौटाता है। सख्त ASCII अंक जाँच के लिए, s.isascii() and s.isdigit() को संयोजित करें। isnumeric() और भी व्यापक है, अंशों और संख्यात्मक-मूल्यवान Unicode वर्णों को कवर करता है। इसके लिए पहुँचने से पहले जानें कि आपको वास्तव में किसकी आवश्यकता है।

python
"42".isdigit()       # True
"hello".isalpha()    # True
"hello42".isalnum()  # True
"   ".isspace()      # True
"Hello".islower()    # False
"HELLO".isupper()    # True

व्यवहार में

व्हाइटस्पेस हटाएँ, केस सामान्यीकृत करें, फिर जो आपको चाहिए उसे निकालें। यह क्रम लगभग किसी भी उपयोगकर्ता-प्रदत्त टेक्स्ट को संभालता है:

python
raw_input = "  [email protected]  "
email     = raw_input.strip().lower()   # "[email protected]"

at_pos   = email.find("@")
username = email[:at_pos]
domain   = email[at_pos + 1:]

print(f"User:   {username}")    # "arav"
print(f"Domain: {domain}")      # "example.com"

भागों से एक URL बनाना और तुरंत इसे सत्यापित और पार्स करना:

python
BASE_URL = "https://api.example.com"
version  = "v2"
resource = "users"
user_id  = 42

url      = f"{BASE_URL}/{version}/{resource}/{user_id}"
# "https://api.example.com/v2/users/42"

protocol = url.split("://")[0]                    # "https"
secured  = url.startswith("https")
domain   = url.split("://")[1].split("/")[0]      # "api.example.com"

print(f"Protocol : {protocol}")
print(f"Secure   : {secured}")
print(f"Domain   : {domain}")

find(), स्लाइसिंग, और f-string संरेखण का उपयोग करके एक संरचित लॉग लाइन को पार्स करना:

python
log_entry = "[2024-01-15 09:42:11] ERROR: File not found: report.csv"

timestamp = log_entry[1:20]
rest      = log_entry[22:]                # "ERROR: File not found: report.csv"
colon_pos = rest.find(":")
level     = rest[:colon_pos]              # "ERROR"
message   = rest[colon_pos + 2:]          # "File not found: report.csv"

print(f"[{timestamp}] {level:>8}: {message}")
# [2024-01-15 09:42:11]    ERROR: File not found: report.csv

find() सीमा का पता लगाता है, स्लाइसिंग भागों को निकालती है, और >8 format spec गंभीरता लेबल को दाएँ-संरेखित करता है ताकि level के नामों की लंबाई अलग होने पर भी कॉलम सुसंगत रहें।

मेथड संदर्भ

मेथडयह क्या करता है
.lower() / .upper()सभी lowercase / सभी uppercase में परिवर्तित करें
.title() / .capitalize()प्रत्येक शब्द को कैपिटलाइज़ करें / केवल पहला
.strip() / .lstrip() / .rstrip()आसपास के व्हाइटस्पेस हटाएँ
.find(sub)पहले मैच का इंडेक्स, या -1
.count(sub)sub कितनी बार दिखाई देता है
.startswith(s) / .endswith(s)उपसर्ग / प्रत्यय जाँच
.replace(old, new)घटनाओं को बदलें
.split(sep)एक list में विभाजित करें
sep.join(iterable)वस्तुओं को एक स्ट्रिंग में जोड़ें
.isdigit() / .isalpha() / .isalnum()वर्ण प्रकार जाँच