কম্পিউটার টিউটোরিয়াল

পাইথন স্ট্রিং: পাইথনের সবচেয়ে জনপ্রিয় ডেটা টাইপগুলোর একটি

স্ট্রিং পাইথনের সবচেয়ে জনপ্রিয় ডেটা টাইপগুলোর একটি। উচ্চ স্তরে, একটি স্ট্রিং হলো ক্যারেক্টার সিকোয়েন্স সমন্বিত একটি অবজেক্ট। একটি ক্যারেক্টার হলো একটি প্রতীক — উদাহরণস্বরূপ, ইংরেজি ভাষায় তাদের বর্ণমালায় ২৬টি ক্যারেক্টার রয়েছে।

পাইথনে স্ট্রিং কী?

পাইথনে স্ট্রিং তৈরি করা খুব সহজ — শুধু ক্যারেক্টারগুলোকে কোটেশনের ভিতরে রাখলেই হবে — যা সিঙ্গেল (') বা ডাবল (") কোটেশন হতে পারে। একটি ভেরিয়েবলে এসাইন করে স্ট্রিং শুরু ও ডিক্লেয়ার করুন:

doubleQuoteString = "I'm a string"
singleQuoteString = 'I\'m a string'  # সিঙ্গেল কোটেশন এস্কেপ করতে হবে স্ট্রিং ভ্যালু হিসেবে ট്രീট করার জন্য

মনে রাখবেন: যদি আপনি সিঙ্গেল কোটেশনে আবদ্ধ একটি স্ট্রিংয়ের ভিতরে অপোস্ট্রফি ব্যবহার করতে চান, তবে সেটিকে \ দিয়ে এস্কেপ করতে হবে। এতে কোটেশনটি স্ট্রিং-এর অংশ হিসেবে ট್ರೀট হবে, স্ট্রিং-এর শেষ হিসেবে নয়।

ডাকস্ট্রিং এবং মাল্টি-লাইন স্ট্রিং

ডাকস্ট্রিং পাইথনে স্ট্রিং-এর আরেকটি প্রকার। এগুলো ট্রিপল কোটেশন (""") দিয়ে আবদ্ধ থাকে এবং একটি ফাংশন বা ক্লাসের প্রথম লাইনে মাল্টি-লাইন কমেন্ট হিসেবে ট്രീট হয়।

def printString(str):
    ''' takes in a string and prints it to the console '''
    print(str)

একটি ডাকস্ট্রিং একটি কোড ব্লকের উদ্দেশ্য বর্ণনা করে। যদি আপনি লজিকে ডাকস্ট্রিং ব্যবহার করতে চান, তবে সেটিকে একটি ভেরিয়েবলে এসাইন করে পারেন। ভেরিয়েবলে এসাইন করলে ডাকস্ট্রিং একটি মাল্টি-লাইন স্ট্রিং-এ পরিণত হয়।

multiline = ''' I'm a multi-line string that can be assigned to a variable. The format follows exactly the way YOU input it. '''
print(multiline)

মাল্টি-লাইন স্ট্রিং ট্রিপল কোটেশনের ভিতরের ফরম্যাটিংয়ের অনুযায়ী থাকে। ভেরিয়েবল এসাইনমেন্ট ছাড়া স্ট্রিংটি কমেন্ট হিসেবে ট്രീট হবে এবং স্কিপ হয়ে যাবে।

র স্ট্রিং (Raw Strings)

পাইথন র স্ট্রিং নামে একটি কনসেপ্ট ব্যবহার করে। এই কনসেপ্ট স্ট্রিং-এর ভিতরের সবকিছু যেভাবে আপনি লিখেছেন সেভাবেই ট്രീট করে — বিশেষ করে ব্যাকস্ল্যাশ (\) কোনো এস্কেপ সিকোয়েন্স হিসেবে ব্যবহার হয় না। একটা তুলনা:

notRaw = "I'm a not a raw string, and escape chars DO matter \n\r\t\b\a"
rawString = r"I'm a raw string, where escape chars don't matter \n\r\t\b\a"
print(notRaw)  # I'm not a raw string, and escape chars DO matter.
print(rawString)  # I'm a raw string, where escape chars don't matter \n\r\t\b\a

র স্ট্রিং নির্দেশ করা হয় একটি সাধারণ স্ট্রিং-এর সাথে r লেটার প্রিফিক্স দিয়ে:

r"This is a raw string"

র স্ট্রিং ব্যবহার করুন যখন আপনাকে ব্যাকস্ল্যাশকে কোনো স্পেশাল এস্কেপ সিকোয়েন্স নির্দেশ করতে না দিতে হয়।

স্ট্রিং-এ ইউনিকোড ক্যারেক্টার

ইউনিকোড হলো একটি ক্যারেক্টার স্পেসিফিকেশন যার লক্ষ্য হলো যেকোনো ভাষায় ব্যবহৃত প্রতিটি ক্যারেক্টরকে একদম আলাদা একটি কোড দিয়ে চিহ্নিত করা। অধিকাংশ ডকুমেন্টেশনে ইউনিকোড ভ্যালুগুলো এভাবে প্রকাশ করা হয়:

U+<unicode hex value> ⇒ U+2661 ⇒ ♥

U+2661 আমাদের ব্যবহারের জন্য উপলব্ধ ইউনিকোড ক্যারেক্টরের একটি উদাহরণ। দশ হাজার হাজার ক্যারেক্টার আছে যেগুলো বিশ্বের সব ভাষাকে প্রকাশ করে।

পাইথন ৩-এ ইউনিকোড লেখা

পাইথন ৩-এ ইউনিকোড ক্যারেক্টার লেখতে হলে একটি সাধারণ স্ট্রিং-এ এস্কেপ সিকোয়েন্স ব্যবহার করুন যা \u দিয়ে শুরু হয় এবং ক্যারেক্টরের জন্য নির্ধারিত কোড দিয়ে শেষ হয় (প্লাস চিহ্নের পরের নম্বর)।

unicodeString = '\u2661'
print(unicodeString)  # ♥

আপনি একসাথে যত চাই उतনো ইউনিকোড ক্যারেক্টার চেইন করতে পারেন।

রেগুলার স্ট্রিং-এ ইউনিকোড ব্যবহার করার এই প্রসেস পাইথন ২ থেকে আপডেটেড। পুরনো ভার্সনে, আপনাকে আলাদা একটি ইউনিকোড স্ট্রিং ব্যবহার করতে হতো যা u'\u<unicode number here>' দিয়ে শুরু হতো, কারণ পাইথন ২ ASCII এবং ইউনিকোড ভ্যালু আলাদা করে ব্যবহার করত।

স্ট্রিং-এ মান অ্যাক্সেস করা

পাইথনে স্ট্রিং-এ মান অ্যাক্সেস করতে স্কয়ার ব্র্যাকেট ব্যবহার করা হয়। স্ট্রিংগুলো অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজের মতো জিরো-বেসড। এর মানে স্ট্রিং-এর প্রথম ক্যারেক্টার জেরোথ ইনডেক্সে শুরু হয়।

hello = "hello world"
print(hello[4])  # o

hello-র চতুর্থ ইনডেক্স প্রিন্ট করলে কনসোলে o প্রিন্ট হবে। আপনি যদি এমন কোনো ইনডেক্স অ্যাক্সেস করার চেষ্টা করেন যা স্ট্রিং-এর অংশ নয়, তবে IndexError: string index out of range দেখতে পাবেন। এই এরর মানে আপনি এমন কোনো ইনডেক্স অ্যাক্সেস করার চেষ্টা করছেন যা আপনার ইনডেক্স সংখ্যার চেয়ে বড় বা ছোট।

নোট: যদি আপনি C বা Java-এর মতো প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে আসেন, তবে আপনি ক্যারেক্টারের আলাদা ডেটা টাইপ থাকার অভ্যাসী। পাইথনে এটা সত্য নয় — অঙ্কিত ক্যারেক্টারগুলো সিম্পলি লেথ वन वाली একটি সাবস্ট্রিং হিসেবে ট്രീট হয়।

স্ট্রিং-এ একাধিক ক্যারেক্টার অ্যাক্সেস করা

একসাথে একাধিক ক্যারেক্টার অ্যাক্সেস করতে স্ট্রিং স্লাইসিং ব্যবহার করুন। সিনট্যাক্স:

string_name[first_index? : another_index?]

শেষ ইনডেক্স নন-ইনক্লूसিভ। পূর্বের উদাহরণে Hello[1:3] রিটার্ন করবে el, ell না।

পাইথনে স্লাইসিং-এর মজার ব্যাপার হলো ইনডেক্স ভ্যালুগুলো স্লাইস করার জন্য বাধ্যতামূলক নয়।

পাইথনে স্ট্রিং স্লাইস করার কিছু সাধারণ পদ্ধতি:

  • string_name[:] — কোলন ব্যবহার করলে পুরো স্ট্রিং স্লাইস হয়ে একটি কপি তৈরি হয়।
hello = "hello world"
copy = hello[:] + " ⇐ whole string"
print(copy)  # hello world ⇐ whole string
  • string_name[first_index:] — কোনো ইনডেক্স থেকে স্ট্রিং-এর শেষ পর্যন্ত স্লাইস করা যায় লাস্ট ইনডেক্স খালি রেখে।
hello = "hello world"
copy = hello[2:] + " ⇐ An index to end of string"
print(copy)  # llo world ⇐ An index to end of string
  • string_name[:second_index] — শুরু থেকে অন্য কোনো ইনডেক্স পর্যন্ত স্লাইস করার জন্য প্রথম ইনডেক্সের জায়গা খালি রাখুন।
hello = "hello world"
copy = hello[:7] + " ⇐ beginning to index inside of string"
print(copy)  # hello w ⇐ beginning to index inside of string
  • string_name[first_index:second_index] — দুটি নির্দিষ্ট ইনডেক্স দিয়ে স্লাইস করার জন্য মনে রাখবেন স্লাইস মেথড নন-ইনক্লूसিভ। তাই ইনডেক্স ১ থেকে ৬ পর্যন্ত চাইলে আপনাকে hello[1:7] ফরম্যাট করতে হবে।
hello = "hello world"
copy = hello[1:7] + " ⇐ first index to another index"
print(copy)  # ello w ⇐ beginning to another index inside of string

নেগেটিভ নম্বরও ব্যবহার করা যায়:

hello = "hello world"
copy = hello[-7:-2] + " ⇐ negative indexes"
print(copy)  # o wor ⇐ negative indexes

স্ট্রিং স্লাইসিং তখন খুব কাজে লাগে যখন আপনি স্ট্রিং ম্যানিপুলেট করতে চান কিন্তু অরিজিনাল স্ট্রিং পরিবর্তন করতে চান না। এটা সিলেক্টেড ইনডেক্সগুলোর একটা কপি মেমোরিতে বানায় যাতে আপনি সেগুলো আপডেট করতে পারেন অরিজিনাল স্ট্রিং পরিবর্তন না করে।

পাইথনে স্ট্রিং-এর মধ্য দিয়ে লুপ করা

পাইথনে, আমরা স্ট্রিংকে অ্যারের মতোই হ্যান্ডেল করি। আমরা স্ট্রিং-এর মধ্য দিয়ে লুপ করতে পারি ঠিক যেমন অ্যারের জন্য করি for...in সিনট্যাক্স ব্যবহার করে:

# for...in syntax
for  in :
    # do logic here

# example
word = "career karma"
for letter in word:
    print(letter)  # প্রতিটি ইটারেশনে সেটি ইনডেক্সের ক্যারেক্টার প্রিন্ট করবে

আমরা letter-কে এবং word-কে এসাইন করি career karma এর মধ্য দিয়ে লুপ করার জন্য। প্রতিটি ইটারেশনে সেটি সেই ইটারেশনের ক্যারেক্টার প্রিন্ট করবে।

স্ট্রিং-এর দৈর্ঘ্য বের করা

স্ট্রিং-এর দৈর্ঘ্য বের করতে len() মেথড ব্যবহার করুন।

lenExample = "The quick brown fox jumps over the lazy dog."
print(len(lenExample))

আপনার কোডে অন্যজায়গায় len কীওয়ার্ড ব্যবহার করবেন না। ইন্টারপ্রেটার ফাংশনটি আপনার নামকৃত ভেরিয়েবলের সাথে বিভ্রান্ত হবে।

in এবং not in ব্যবহার করা

আপনি পাইথন স্ট্রিং-এ in এবং not in কীওয়ার্ড ব্যবহার করে চেক করতে পারেন কোনো কিছু স্ট্রিং-এ কন্টেইন করা আছে কিনা।

checkString = "Career Karma will help you make a career switch to the tech industry"

checkString হলো স্ট্রিং যা আমরা পরবর্তী দুটি উদাহরণে ব্যবহার করব।

in ব্যবহার

in কীওয়ার্ড ব্যবহার করে টেস্ট করা যায় কোনো কিছু কোনো স্ট্রিং-এ আছে কিনা, পাইথন ইন্টারপ্রেটারকে বলিয়ে যে আপনি জানতে চান আপনার সার্চ টার্মটি স্ট্রিং-এ আছে কিনা।

print("tech" in checkString)  # True

পাইথন একটি ডিজায়রেবল ল্যাঙ্গুয়েজ কারণ এটি সহজে পড়া যায়। এখানে সিনট্যাক্সটি ব্যাসিক্যালি সেভাবেই যা আপনি অন্য কারো কাছে প্রশ্ন করতেন:

প্রশ্ন: "tech" in checkString?

(স্ট্রিং স্ক্যান করে)

উত্তর: Yes, yes it is. (True)

not in ব্যবহার

not in কী ফ্রেজ টেস্ট করে কোনো কিছু স্ট্রিং-এ নেই কিনা। এটি কিছুটা বিভ্রান্তিকর হতে পারে, তাই মনোযোগ দিন। এখানে, আপনি যদি জিজ্ঞেস করেন কোনো কিছু স্ট্রিং-এ নেই কিনা, তবে সেটি True রিটার্ন করবে যদি সেটি স্ট্রিং-এ নেই, অথবা False রিটার্ন করবে যদি সেটি স্ট্রিং-এ থাকে।

print("tech" not in checkString)  # False

এখানে আমরা কীভাবে এই সিনট্যাক্সকে পড়তে পারি যদি আমরা অন্য কারো সাথে কথা বলতাম:

প্রশ্ন: "tech" not in checkString?

(স্ট্রিং স্ক্যান করে)

উত্তর: No. The word "tech" is in checkString (False)

কি আমরা একটি স্ট্রিং-এর মেকআপ পরিবর্তন করতে পারি?

পাইথনে স্ট্রিংগুলো ইমিউটেবল (immutable)। স্ট্রিং-এর বানানোর ক্যারেক্টারগুলো ইনিশিয়াল এসাইনমেন্টের পরে মিউটেট বা পরিবর্তন করা যায় না।

delString = "Can we delete this or change this?"
delString[2] = "b"
print(delString)

এই কোডটি আপনার পাইথন ইন্টারপ্রেটারে রান করে দেখুন। এই এররটি আসবে:

Traceback (most recent call last):
File "main.py", line no., in 
delString[2] = "b"
TypeError: 'str' object does not support item assignment

এখানে TypeError আমাদের বলে দিচ্ছে পাইথনে স্ট্রিং ক্যারেক্টার রি-অসাইন করার অনুমতি দেয় না। আপনি যদি ইনডিভিজুয়াল ক্যারেক্টার পরিবর্তন করতে চান, তবে পুরো স্ট্রিংকে আপনার ইচ্ছামত নতুন স্ট্রিং-এ রি-অসাইন করতে হবে।

delString = delString[:2] + "b" + delString[3:]
print(delString)

এখানে কোডটি সঠিক পদ্ধতিটি দেখাচ্ছে যা আমরা delString[2] = "b" লাইন দিয়ে করতে চেয়েছিলাম। একটি স্ট্রিং অবজেক্ট পরিবর্তন করতে পুরো রি-অসাইনমেন্ট দরকার।

এটাও মানে স্ট্রিং-এ একক ক্যারেক্টার ডিলিট করা সম্ভব নয়। কিন্তু আপনি del কীওয়ার্ড দিয়ে পুরো স্ট্রিং ডিলিট করতে পারেন।

del delString
print(delString)  # এরর রিটার্ন করবে বা লিন্টার আনডিফাইনড হিসেবে ধরবে

লকপ্রিয় স্ট্রিং মেথডগুলো

পাইথন স্ট্রিং-এর সাথে অসমংক মেথড জড়িত। সবচেয়ে আপ-টু-ডেট তালিকার জন্য পাইথন ডকস দেখুন।

এখানে কিছু সবচেয়ে জনপ্রিয় মেথড। testString হলো একটি স্যাম্পল স্ট্রিং যা অধিকাংশ মেথড ডেমো করার জন্য ব্যবহার হবে।

testString = "this is a test string."

capitalize()

capitalize মেথড স্ট্রিং-এর প্রথম অক্ষরটি বড় হাতের করে দেয়:

capitalized = testString.capitalize()
print(capitalized)  # This is a test string

find()

এই বিল্ট-ইন মেথড পাস করা আর্গুমেন্ট कहা থেকে শুরু হয়েছে সেটির ইনডেক্স রিটার্ন করে। না পেলে -1 রিটার্ন করে।

found = testString.find("test")
notfound = testString.find("not")
print(found)      # 10
print(notfound)   # -1

join()

join মেথড মেথডে পাস করা ইটারেবল অবজেক্ট (স্ট্রিং, সেট, টাপল, বা লিস্ট হতে পারে) এর মধ্য দিয়ে লুপ করে এবং যে স্ট্রিং-এ মেথডটি কল করা হয়েছে সেটিকে সেপারেটর হিসেবে যোগ করে। একটা উদাহরণ:

separator = ", "  # আমাদের সেপারেটর - এই স্ট্রিং-এ মেথডটি কল করা হচ্ছে
numbers = "123"   # আমাদের ইটারেবল। এই উদাহরণে এটি একটি স্ট্রিং
joinedByComma = separator.join(numbers)
print(joinedByComma)  # 1, 2, 3

join মেথডসহ এক্সপেরিমেন্ট করুন লিস্ট, সেট, বা টাপলের সাথে কী কী করা যায় দেখতে!

lower() এবং upper()

lower এবং upper বিল্ট-ইন ফাংশনগুলো স্ট্রিং-এর কেস নিয়ে কাজ করে। Lower স্ট্রিং-এর একটি কপি সব ছোট হাতের করে তৈরি করে; upper সব বড় হাতের করে তৈরি করে:

uppercase = testString.upper()
print(uppercase)  # THIS IS A TEST STRING
lowercase = testString.lower()
print(lowercase)  # this is a test string

এই মেথডগুলো স্ট্রিং ম্যানিপুলেট করার উপলব্ধ মেথডগুলোর মাত্র একটি অংশ। এগুলো শিখার পর অন্য পাইথন স্ট্রিং মেথড যেমন split(), replace(), title(), এবং swapcase() দেখুন।

উপসংহার

এই আর্টিকেলে আমরা দেখেছি পাইথন স্ট্রিং কী, সেগুলো কীভাবে ব্যবহার করা হয়, এবং আমাদের ব্যবহারের জন্য উপলব্ধ কিছু বিল্ট-ইন মেথড। এই গাইড মাস্টার করার পর আমাদের string formatting in Python আর্টিকেলটি দেখে আপনার লার্নিং আরও এগিয়ে নিন!

  1. পাইথন ৩-এ স্ট্যান্ডার্ড ডেটা টাইপগুলো কী কী

  2. পাইথনে সবচেয়ে দক্ষ স্ট্রিং কনক্যাটেনেশন পদ্ধতি

  3. পাইথন ডেটা টাইপ ও কনভারশন মাস্টার করুন: একটি প্র্যাকটিক্যাল গাইড

  4. পাইথন স্ট্রিং মাস্টার করুন: অপরিহার্য অপারেশন ও সেরা অনুশীলন