Python-এ স্ট্রিং: split, replace, strip, join, স্লাইস ও f-string
Python-এর স্ট্রিং (str) হলো অপরিবর্তনীয় Unicode অক্ষরের ক্রম। split() স্ট্রিংকে তালিকায় ভাঙে, join() তালিকাকে আবার জোড়া দেয়, replace() একটি অংশ বদলায়, strip() দুই প্রান্তের ফাঁকা জায়গা সরায়; প্রতিটি মেথড নতুন স্ট্রিং ফেরত দেয়। মান বসানোর সবচেয়ে সুবিধাজনক উপায় f-string: f"{name}: {price:.2f}"।
Python-এর প্রায় প্রতিটি প্রোগ্রামে স্ট্রিং থাকে: ব্যবহারকারীর ইনপুট, ফাইলের নাম, CSV-র লাইন, API-র উত্তর। str ধরন টেক্সট রাখে Unicode-এ, তাই বাংলা অক্ষর ও ইমোজি কোনো সেটিংস ছাড়াই কাজ করে। সবচেয়ে বেশি ব্যবহৃত মেথড split, replace, strip ও join, আর মান দেখানোর সবচেয়ে সুবিধাজনক উপায় f-string। উদাহরণসহ সবকিছু দেখা যাক।
Python-এ স্ট্রিং কীভাবে কাজ করে
স্ট্রিং একক বা দ্বৈত উদ্ধৃতিতে লেখা হয় — পার্থক্য নেই: 'coffee' আর "coffee" একই। তিনটি উদ্ধৃতি চিহ্ন দিয়ে বহু-লাইনের স্ট্রিং বানানো যায়, যেখানে লাইন ভাঙা যেমন আছে তেমনই থাকে।
name = "Coffee"
note = """প্রথম লাইন
দ্বিতীয় লাইন"""
print(len(name)) # 6 — অক্ষরের দৈর্ঘ্য
স্ট্রিংয়ের প্রধান বৈশিষ্ট্য অপরিবর্তনীয়তা। কোনো মেথড স্ট্রিং বদলায় না, বরং নতুন একটি ফেরত দেয়। তাই s.replace("a", "b") কোনো কিছুকে নির্ধারণ না করলে কিছুই হয় না — লিখতে হবে s = s.replace("a", "b")। এটি নতুনদের সবচেয়ে সাধারণ ভুল।
বিশেষ অক্ষর, লাইন ভাঙা ও raw স্ট্রিং
লাইন ভাঙা লেখা হয় \n, ট্যাব \t, ব্যাকস্ল্যাশ \\। r উপসর্গ স্ট্রিংকে «raw» করে: এতে ব্যাকস্ল্যাশগুলো বিশেষ অর্থে ব্যবহৃত হয় না। Windows-এর পথ ও regular expression-এর জন্য এটি কাজে লাগে।
print("মোট:\n30 ৳")
path = r"C:\new\table.csv" # \n ও \t বিশেষ অক্ষরে রূপান্তরিত হবে না
দীর্ঘ এক্সপ্রেশন কোডে পরের লাইনে নিতে বন্ধনীতে মুড়ুন: বন্ধনীর ভেতরের পাশাপাশি স্ট্রিং-লিটারালগুলো Python নিজেই জুড়ে দেয়।
split: স্ট্রিংকে তালিকায় ভাঙা
split() মেথড একটি বিভাজক দিয়ে স্ট্রিং ভেঙে তালিকা ফেরত দেয়। কোনো আর্গুমেন্ট না দিলে এটি যেকোনো ফাঁকা অক্ষরে ভাঙে এবং একাধিক ফাঁকা জায়গা উপেক্ষা করে — কমান্ড বিশ্লেষণে এটি সুবিধাজনক।
"add Coffee 250".split() # ['add', 'Coffee', '250']
"2026-10-16".split("-") # ['2026', '10', '16']
"a,b,,c".split(",") # ['a', 'b', '', 'c']
"key=value=x".split("=", 1) # ['key', 'value=x']
পার্থক্যটি লক্ষ করুন: স্পষ্ট বিভাজক দিলে খালি অংশগুলো থেকে যায়। দ্বিতীয় আর্গুমেন্ট maxsplit কাটার সংখ্যা সীমিত করে, আর rsplit() ডান দিক থেকে কাটে। টেক্সটকে লাইনে ভাঙতে splitlines() ব্যবহার করুন: এটি \n ও \r\n দুটোই বোঝে এবং শেষে একটি খালি উপাদান রাখে না।
text = "coffee\ntaxi\n"
text.split("\n") # ['coffee', 'taxi', '']
text.splitlines() # ['coffee', 'taxi']
join: তালিকাকে স্ট্রিংয়ে জোড়া দেওয়া
join() উল্টো কাজ করে। এটি ডাকা হয় বিভাজক-স্ট্রিংয়ের উপর, আর আর্গুমেন্ট হিসেবে নেয় স্ট্রিংয়ের তালিকা:
items = ["coffee", "taxi", "lunch"]
print(", ".join(items)) # coffee, taxi, lunch
print("\n".join(items)) # প্রতিটি আইটেম নতুন লাইনে
সব উপাদান অবশ্যই স্ট্রিং হতে হবে, নইলে পাবেন TypeError: sequence item 0: expected str instance, int found। সংখ্যা আগে রূপান্তর করুন: ", ".join(str(x) for x in amounts)।
স্ট্রিং জোড়া দেওয়া ও যুক্ত করা
দুটি স্ট্রিং + দিয়ে জোড়া দেওয়া যায়, আর * দিয়ে পুনরাবৃত্তি করা যায়: "-" * 20। কিন্তু লুপে শত শত অংশ += দিয়ে জুড়লে ধীর হয়, কারণ প্রতিবার নতুন স্ট্রিং বানানো হয়। অংশগুলো তালিকায় রেখে একটি join()-এ জুড়ুন। স্ট্রিংয়ের সঙ্গে সংখ্যা সরাসরি যোগ করা যায় না: "মোট: " + 5 দেবে TypeError, এখানে দরকার str() বা f-string।
replace: অংশ বদলানো
replace(old, new) সব মিলে যাওয়া অংশ বদলায়। তৃতীয় আর্গুমেন্ট বদলের সংখ্যা সীমিত করে।
price = "1,250.50"
price = price.replace(",", "")
print(float(price)) # 1250.5
"a-b-c".replace("-", "+", 1) # 'a+b-c'
মেথডটি বড়-ছোট হাতের অক্ষরের পার্থক্য মানে এবং হুবহু মিল খোঁজে। প্যাটার্ন দিয়ে বদল (যেমন «সব সংখ্যা») দরকার হলে re মডিউল ও re.sub() লাগে।
strip, lstrip, rstrip: স্ট্রিং ছাঁটা
strip() দুই প্রান্ত থেকে ফাঁকা জায়গা, ট্যাব ও লাইন ভাঙা সরায়। lstrip() শুধু বাঁ দিক, rstrip() শুধু ডান দিক পরিষ্কার করে। ব্যবহারকারীর ইনপুট বা ফাইলের লাইন নিয়ে কাজ শুরুর আগে এটিই প্রথম করণীয়।
raw = " Coffee \n"
raw.strip() # 'Coffee'
raw.rstrip() # ' Coffee'
"xxCoffeexx".strip("x") # 'Coffee'
আর্গুমেন্টটি অক্ষরের একটি সেট, পুরো উপস্ট্রিং নয়: "abcTextcba".strip("abc") প্রান্ত থেকে যেকোনো ক্রমে সব a, b ও c সরাবে। কোনো নির্দিষ্ট উপসর্গ বা প্রত্যয় কাটতে removeprefix() ও removesuffix() ব্যবহার করুন (Python 3.9 থেকে)।
স্ট্রিংয়ের অন্যান্য কাজের মেথড
| মেথড | কাজ | উদাহরণ → ফল |
|---|---|---|
lower(), upper() | অক্ষরের কেস | "Coffee".lower() → 'coffee' |
startswith(), endswith() | শুরু ও শেষ যাচাই | "a.csv".endswith(".csv") → True |
find() | উপস্ট্রিংয়ের অবস্থান বা -1 | "coffee".find("f") → 2 |
count() | কতবার আছে | "banana".count("a") → 3 |
isdigit() | শুধু সংখ্যা? | "250".isdigit() → True |
zfill() | শূন্য দিয়ে ভরাট | "7".zfill(3) → '007' |
স্ট্রিংয়ে কোনো অংশ আছে কিনা সবচেয়ে সহজে দেখা যায় in অপারেটর দিয়ে: if "coffee" in text.lower():। স্ট্রিং == দিয়ে অক্ষরে অক্ষরে এবং কেস মিলিয়ে তুলনা হয়; কেস না মিলিয়ে তুলনার জন্য দুটিকেই casefold()-এ আনুন।
স্ট্রিংয়ের স্লাইস
স্ট্রিং একটি ক্রম, তাই অক্ষরগুলো শূন্য থেকে গোনা সূচকে পাওয়া যায়, আর ঋণাত্মক সূচক শেষ থেকে গোনে। স্লাইস s[start:stop:step] একটি উপস্ট্রিং ফেরত দেয়; ডান সীমা অন্তর্ভুক্ত নয়।
s = "Python"
s[0] # 'P'
s[-1] # 'n'
s[0:3] # 'Pyt'
s[2:] # 'thon'
s[::2] # 'Pto'
s[::-1] # 'nohtyP' — স্ট্রিং উল্টে দেওয়া
সীমার বাইরে গেলে স্লাইস কখনো ত্রুটি দেয় না: s[0:100] পুরো স্ট্রিং ফেরত দেবে। কিন্তু s[100] দেবে IndexError। সূচক ধরে একটি অক্ষর বদলানো যায় না (s[0] = "J" — TypeError), বরং নতুন স্ট্রিং বানাতে হয়: "J" + s[1:]।
Python-এর f-string
স্ট্রিংয়ের আগে f অক্ষরের অর্থ: ঘেরা বন্ধনীর ভেতরের এক্সপ্রেশনগুলো হিসাব হয়ে টেক্সটে বসবে। Python 3.6 থেকে এটিই স্ট্রিং ফরম্যাটের প্রধান উপায়: format()-এর চেয়ে ছোট এবং পুরনো % অপারেটরের চেয়ে দ্রুত।
item = "Coffee"
price = 250
print(f"{item}: {price} ৳") # Coffee: 250 ৳
print(f"ছাড়ের পর: {price * 0.9} ৳") # ছাড়ের পর: 225.0 ৳
print(f"{item=}") # item='Coffee' — ডিবাগের জন্য সুবিধাজনক
সংখ্যার ফরম্যাট ও প্রান্তিককরণ
বন্ধনীর ভেতরে কোলনের পর লেখা হয় ফরম্যাট-স্পেসিফায়ার। এতে নির্ধারণ হয় দশমিক গোলাকরণ, সংখ্যার বিভাজক, প্রস্থ ও প্রান্তিককরণ:
| লেখা | ফল | অর্থ |
|---|---|---|
f"{3.14159:.2f}" | 3.14 | ২ ঘর পর্যন্ত গোল করা |
f"{1250000:,}" | 1,250,000 | অঙ্কের বিভাজক |
f"{1250000:_}" | 1_250_000 | কমার বদলে আন্ডারস্কোর |
f"{0.256:.1%}" | 25.6% | শতাংশ |
f"{'coffee':<10}|" | coffee | | বাঁ দিকে, প্রস্থ ১০ |
f"{250:>8}" | 250 | ডান দিকে |
f"{7:03d}" | 007 | শূন্য দিয়ে ভরাট |
টার্মিনালের টেবিলের জন্য প্রান্তিককরণ কাজে লাগে: f"{name:<12}{amount:>10.2f}" কলামগুলো ঠিকঠাক সাজিয়ে দেয়। মনে রাখবেন, ফরম্যাট শুধু প্রদর্শনের সময় দরকার। টাকা রাখুন পয়সায় (int) বা Decimal-এ, float-এ নয়: 0.1 + 0.2 দেয় 0.30000000000000004।
f-string-এর ভেতরে উদ্ধৃতি ও লাইন ভাঙা
Python 3.12 থেকে (PEP 701) f-string-এর একটি আনুষ্ঠানিক ব্যাকরণ এসেছে: বন্ধনীর ভেতরে বাইরের মতোই উদ্ধৃতি চিহ্ন, ব্যাকস্ল্যাশ ও লাইন ভাঙা ব্যবহার করা যায়, এবং নেস্টিংয়ের সীমা নেই। বন্ধনীর ভেতরের ত্রুটি এখন সঠিক অবস্থান দেখায়। পুরনো সংস্করণে ভেতরে ভিন্ন ধরনের উদ্ধৃতি লিখুন: f"{d['key']}", আর লাইন ভাঙার জন্য আলাদা ভেরিয়েবল বা chr(10) ব্যবহার করুন।
বহু-লাইনের টেক্সটের জন্য তিন উদ্ধৃতির f-string উপযোগী: f"""মোট: {total}\nসংখ্যা: {count}"""।
format() ও %: পুরনো পদ্ধতি
পুরনো কোডে দেখা যাবে "{}: {}".format(item, price) ও "%s: %d" % (item, price)। format()-এর স্পেসিফায়ার f-string-এর মতোই। টেমপ্লেট যখন ডেটা থেকে আলাদা থাকে, যেমন কনফিগে, তখন format() এখনো কাজের।
স্ট্রিং বিশ্লেষণ: ব্যবহারিক উদাহরণ
মেথডগুলো একসঙ্গে ব্যবহার করা যাক। ধরুন ফাইল থেকে " 2026-10-16; Coffee ; 250.50 \n" ধরনের লাইন আসে, আর আমাদের তারিখ, নাম ও পয়সায় পরিমাণ লাগবে। ধাপগুলো সাধারণ: প্রান্ত পরিষ্কার, বিভাজকে কাটা, প্রতিটি অংশ ছাঁটা, ধরন রূপান্তর।
line = " 2026-10-16; Coffee ; 250.50 \n"
date, item, raw_amount = [p.strip() for p in line.strip().split(";")]
amount_kop = round(float(raw_amount) * 100)
print(date, item, amount_kop) # 2026-10-16 Coffee 25050
print(f"{item:<10}{amount_kop / 100:>10.2f}")
অংশ তিনটি না হলে আনপ্যাক ValueError: not enough values to unpack বা too many values to unpack দিয়ে থেমে যাবে। প্রকৃত কোডে এমন লাইন আগে থেকে যাচাই করুন, নইলে ব্যতিক্রম ধরুন। উদ্ধৃতি ও escape-সহ আসল CSV ফাইলের জন্য split নয়, স্ট্যান্ডার্ড csv মডিউল নিন।
স্ট্রিংয়ের সাধারণ ভুল
- মেথডের ফল সংরক্ষণ না করা: শুধু
s.strip()লিখলে কিছু বদলায় না। - সংখ্যার তালিকায় join —
TypeError; আগেmap(str, ...)। - strip-এ উপস্ট্রিং দেওয়া: আর্গুমেন্ট অক্ষরের সেট; উপসর্গের জন্য
removeprefix()। - কেস মিলিয়ে তুলনা:
"Coffee" == "coffee"—False। - Windows-এর পথে ব্যাকস্ল্যাশ
rউপসর্গ ছাড়া বিশেষ অক্ষরে রূপান্তরিত হয়।
t-string: তৈরি লেখার বদলে টেমপ্লেট
Python 3.14-এ এসেছে t-string। দেখতে f-string-এর মতো, শুধু উপসর্গ t, তবে ফল ভিন্ন: তৈরি স্ট্রিং নয়, বরং string.templatelib.Template অবজেক্ট। এতে টেক্সটের অংশগুলো (.strings) এবং বসানো মানগুলো (.values) আলাদা থাকে।
name = "<script>"
tpl = t"Hello, {name}!"
print(tpl.strings) # ('Hello, ', '!')
print(tpl.values) # ('<script>',)
এটি কেন দরকার: লাইব্রেরি জোড়া লাগার আগেই মানগুলো পায় এবং প্রক্রিয়া করতে পারে — যেমন HTML-এ কৌণিক বন্ধনী escape করা বা SQL কোয়েরিতে সঠিকভাবে প্যারামিটার পাঠানো। f-string-এ সে সুযোগ নেই, সেখানে সবকিছু আগেই জোড়া লেগে যায়। সাধারণ আউটপুটের জন্য এখনো f-string-ই ব্যবহার করুন।
সারসংক্ষেপ
দৈনন্দিন কাজে Python-এর স্ট্রিংয়ের জন্য ছোট একটি মেথড-সেটই যথেষ্ট: split() ও join() টেক্সট ভাঙে ও জোড়ে, strip() ইনপুট পরিষ্কার করে, replace() অংশ বদলায়, স্লাইস উপস্ট্রিং কাটে, আর f-string নির্দিষ্ট ফরম্যাটে মান দেখায়। অপরিবর্তনীয়তা মনে রাখুন: মেথড নতুন স্ট্রিং ফেরত দেয়, সেটি সংরক্ষণ করতে হয়। স্ট্রিং, সংখ্যা ও f-string খরচের ট্র্যাকারের উদাহরণে কোর্সের একটি লেকচারে বাস্তবে শেখানো হয়েছে।
সাধারণ প্রশ্ন
Python-এ স্ট্রিংয়ের দৈর্ঘ্য কীভাবে জানব?
len(s) ফাংশন অক্ষরের সংখ্যা দেয়। বাংলা ও ইমোজিও Unicode অক্ষর হিসেবে গোনা হয়, বাইট হিসেবে নয়; বাইটের আকার পেতে len(s.encode("utf-8")) লিখুন।
সংখ্যাকে স্ট্রিং এবং স্ট্রিংকে সংখ্যায় কীভাবে বদলাব?
str(250) দেয় '250', আর int("250") ও float("2.5") বিপরীত রূপান্তর করে। স্ট্রিং সংখ্যার মতো না হলে int() ValueError দেয়, তাই ইনপুট যাচাই করা ভালো।
replace আমার স্ট্রিং বদলায় না কেন?
স্ট্রিং অপরিবর্তনীয়, replace নতুন স্ট্রিং ফেরত দেয়। ফলটি নির্ধারণ করুন: s = s.replace("a", "b")।
স্ট্রিং খালি কিনা কীভাবে যাচাই করব?
খালি স্ট্রিং মিথ্যা হিসেবে গণ্য হয়, তাই if not s: যথেষ্ট। স্ট্রিংয়ে শুধু ফাঁকা জায়গা থাকতে পারলে if not s.strip(): লিখুন।
t-string কীভাবে f-string থেকে আলাদা?
f-string সরাসরি তৈরি str ফেরত দেয়, আর t-string (Python 3.14+) হলো Template অবজেক্ট, যেখানে টেক্সটের অংশ ও মানগুলো আলাদা থাকে। এতে HTML ও SQL-এর জন্য ডেটা নিরাপদে escape করা যায়।
“Python 3.15: от новичка до профи” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।
কোর্সে যান