สตริงใน Python: เมธอด split, replace, strip, join, slice และ f-string
สตริง (str) ใน Python คือลำดับอักขระแบบ Unicode ที่แก้ไขไม่ได้ เมธอด split() แยกสตริงเป็นลิสต์ join() รวมลิสต์กลับเป็นสตริง replace() แทนที่ข้อความ และ strip() ตัดช่องว่างหัวท้าย โดยทุกเมธอดคืนสตริงใหม่ ส่วนการแทรกค่าทำได้สะดวกที่สุดด้วย f-string เช่น f"{name}: {price:.2f}"
สตริงอยู่ในทุกโปรแกรม Python ตั้งแต่ข้อความที่ผู้ใช้พิมพ์ ชื่อไฟล์ บรรทัดของ CSV ไปจนถึงคำตอบจาก API ชนิด str เก็บข้อความแบบ Unicode จึงใช้ภาษาไทย ภาษาอื่น และอีโมจิได้โดยไม่ต้องตั้งค่าเพิ่ม เมธอดที่ใช้บ่อยที่สุดคือ split replace strip และ join ส่วนการแสดงค่าออกทางจอทำได้สะดวกที่สุดด้วย f-string บทความนี้จะอธิบายทั้งหมดพร้อมตัวอย่าง
สตริงใน Python ทำงานอย่างไร
สตริงเขียนได้ด้วยเครื่องหมายคำพูดเดี่ยวหรือคู่ ไม่มีความแตกต่างกัน: 'กาแฟ' กับ "กาแฟ" เหมือนกันทุกประการ เครื่องหมายคำพูดสามชั้นสร้างสตริงหลายบรรทัด โดยการขึ้นบรรทัดใหม่จะถูกเก็บไว้ตามที่พิมพ์
name = "กาแฟ"
note = """บรรทัดแรก
บรรทัดที่สอง"""
print(len(name)) # 4 — ความยาวของสตริงเป็นจำนวนอักขระ
คุณสมบัติสำคัญของสตริงคือแก้ไขไม่ได้ เมธอดไม่ได้เปลี่ยนสตริงเดิม แต่คืนสตริงใหม่กลับมา ดังนั้น s.replace("a", "b") โดยไม่กำหนดค่ากลับจะไม่มีผลอะไร ต้องเขียนเป็น s = s.replace("a", "b") นี่คือข้อผิดพลาดที่มือใหม่พบบ่อยที่สุด
อักขระพิเศษ การขึ้นบรรทัดใหม่ และสตริงดิบ
การขึ้นบรรทัดใหม่เขียนด้วย \n แท็บด้วย \t และแบ็กสแลชด้วย \\ คำนำหน้า r ทำให้สตริงเป็น "สตริงดิบ" ซึ่งแบ็กสแลชจะไม่ถูกแปลความ เหมาะกับพาธของ Windows และนิพจน์ทั่วไป (regular expression)
print("ยอดรวม:\n350 บาท")
path = r"C:\new\table.csv" # \n และ \t จะไม่กลายเป็นอักขระพิเศษ
นิพจน์ที่ยาวสามารถขึ้นบรรทัดใหม่ในโค้ดได้โดยห่อด้วยวงเล็บ สตริงลิเทอรัลที่อยู่ติดกันในวงเล็บจะถูกต่อกันโดย Python อัตโนมัติ
split: แยกสตริงเป็นลิสต์
เมธอด split() แบ่งสตริงตามตัวคั่นและคืนค่าเป็นลิสต์ หากไม่ระบุอาร์กิวเมนต์ จะตัดตามอักขระว่างทุกชนิด และละเว้นช่องว่างที่ซ้ำกัน ซึ่งเหมาะกับการแยกคำสั่ง
"add กาแฟ 250".split() # ['add', 'กาแฟ', '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 = "กาแฟ\nแท็กซี่\n"
text.split("\n") # ['กาแฟ', 'แท็กซี่', '']
text.splitlines() # ['กาแฟ', 'แท็กซี่']
join: รวมลิสต์เป็นสตริง
join() คือการกระทำที่กลับกัน เรียกจากสตริงตัวคั่น และรับลิสต์ของสตริงเป็นอาร์กิวเมนต์:
items = ["กาแฟ", "แท็กซี่", "อาหารกลางวัน"]
print(", ".join(items)) # กาแฟ, แท็กซี่, อาหารกลางวัน
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(" ", "").replace(",", ".")
print(float(price)) # 1250.5
"ก-ข-ค".replace("-", "+", 1) # 'ก+ข-ค'
เมธอดนี้แยกตัวพิมพ์เล็กใหญ่และค้นหาแบบตรงทุกตัวอักษร หากต้องการแทนที่ตามรูปแบบ (เช่น "ตัวเลขทั้งหมด") ให้ใช้โมดูล re และฟังก์ชัน re.sub()
strip, lstrip, rstrip: ตัดช่องว่างหัวท้าย
strip() ตัดช่องว่าง แท็บ และการขึ้นบรรทัดใหม่จากทั้งสองด้าน lstrip() ตัดเฉพาะด้านซ้าย และ rstrip() ตัดเฉพาะด้านขวา นี่คือสิ่งแรกที่ควรทำกับข้อมูลที่ผู้ใช้พิมพ์และสตริงจากไฟล์
raw = " กาแฟ \n"
raw.strip() # 'กาแฟ'
raw.rstrip() # ' กาแฟ'
"xxกาแฟxx".strip("x") # 'กาแฟ'
อาร์กิวเมนต์คือชุดอักขระ ไม่ใช่ข้อความย่อยทั้งก้อน เช่น "abcข้อความcba".strip("abc") จะตัด a, b และ c ทุกตัวที่อยู่ริมทั้งสองด้านโดยไม่สนลำดับ หากต้องการตัดคำนำหน้าหรือคำลงท้ายโดยเฉพาะ ให้ใช้ removeprefix() และ removesuffix() (ตั้งแต่ Python 3.9)
เมธอดอื่นของสตริงที่มีประโยชน์
| เมธอด | หน้าที่ | ตัวอย่าง → ผลลัพธ์ |
|---|---|---|
lower(), upper() | เปลี่ยนตัวพิมพ์ | "Latte".lower() → 'latte' |
startswith(), endswith() | ตรวจจุดเริ่มและจุดจบ | "a.csv".endswith(".csv") → True |
find() | ตำแหน่งของข้อความย่อย หรือ -1 | "กาแฟ".find("แ") → 2 |
count() | จำนวนครั้งที่พบ | "banana".count("a") → 3 |
isdigit() | เป็นตัวเลขล้วนหรือไม่ | "250".isdigit() → True |
zfill() | เติมเลข 0 ด้านหน้า | "7".zfill(3) → '007' |
ตรวจว่าสตริงมีข้อความย่อยหรือไม่ ใช้ตัวดำเนินการ in ได้ง่ายที่สุด: if "กาแฟ" in text.lower(): การเปรียบเทียบด้วย == ทำทีละอักขระและแยกตัวพิมพ์ หากต้องการเทียบโดยไม่สนตัวพิมพ์ ให้แปลงทั้งคู่ด้วย casefold() ก่อน
การตัดสตริงด้วย slice
สตริงเป็นลำดับ จึงเข้าถึงอักขระด้วยดัชนีเริ่มจากศูนย์ได้ และดัชนีติดลบจะนับจากท้าย การตัด 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' — กลับลำดับของสตริง
การ slice ไม่ทำให้เกิดข้อผิดพลาดเมื่อเกินขอบเขต: s[0:100] คืนสตริงทั้งหมด แต่ s[100] จะได้ IndexError และไม่สามารถแก้อักขระตามดัชนีได้ (s[0] = "J" ได้ TypeError) ต้องสร้างสตริงใหม่: "J" + s[1:]
f-string ใน Python
ตัวอักษร f หน้าสตริงบอกว่า นิพจน์ในวงเล็บปีกกาจะถูกคำนวณและแทรกลงในข้อความ นี่คือวิธีจัดรูปแบบสตริงหลักตั้งแต่ Python 3.6 สั้นกว่า format() และเร็วกว่าตัวดำเนินการ % แบบเก่า
item = "กาแฟ"
price = 250
print(f"{item}: {price} บาท") # กาแฟ: 250 บาท
print(f"หลังลดราคา: {price * 0.9} บาท") # หลังลดราคา: 225.0 บาท
print(f"{item=}") # item='กาแฟ' — มีประโยชน์ตอนดีบัก
การจัดรูปแบบตัวเลขและการจัดแนว
หลังเครื่องหมายโคลอนในวงเล็บปีกกาจะเขียนตัวระบุรูปแบบ (format spec) ซึ่งกำหนดการปัดเศษ ตัวคั่นหลัก ความกว้าง และการจัดแนว:
| รูปแบบ | ผลลัพธ์ | ความหมาย |
|---|---|---|
f"{3.14159:.2f}" | 3.14 | ปัดเศษเหลือ 2 ตำแหน่ง |
f"{1250000:,}" | 1,250,000 | ตัวคั่นหลัก |
f"{1250000:_}" | 1_250_000 | ใช้ขีดล่างแทนลูกน้ำ |
f"{0.256:.1%}" | 25.6% | เปอร์เซ็นต์ |
f"{'Latte':<10}|" | Latte | | จัดชิดซ้าย ความกว้าง 10 |
f"{250:>8}" | 250 | จัดชิดขวา |
f"{7:03d}" | 007 | เติมเลข 0 ด้านหน้า |
การจัดแนวมีประโยชน์กับตารางในเทอร์มินัล เช่น 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; กาแฟ ; 250,50 \n" และต้องการวันที่ ชื่อรายการ และจำนวนเงินเป็นสตางค์ ขั้นตอนตามปกติคือ ตัดส่วนหัวท้าย แยกตามตัวคั่น ทำความสะอาดแต่ละส่วน แล้วแปลงชนิดข้อมูล
line = " 2026-10-16; กาแฟ ; 250,50 \n"
date, item, raw_amount = [p.strip() for p in line.strip().split(";")]
amount_kop = round(float(raw_amount.replace(",", ".")) * 100)
print(date, item, amount_kop) # 2026-10-16 กาแฟ 25050
print(f"{item:<10}{amount_kop / 100:>10.2f}")
หากได้ส่วนที่ไม่ใช่สามส่วน การแยกค่า (unpacking) จะล้มเหลวด้วย ValueError: not enough values to unpack หรือ too many values to unpack ในโค้ดจริงควรตรวจสอบบรรทัดเหล่านี้ล่วงหน้า หรือดักจับข้อยกเว้น และสำหรับไฟล์ CSV จริงที่มีเครื่องหมายคำพูดและการหลบอักขระ ให้ใช้โมดูลมาตรฐาน csv แทน split
ข้อผิดพลาดที่พบบ่อยกับสตริง
- ไม่ได้เก็บผลลัพธ์ของเมธอด
s.strip()โดยไม่กำหนดค่ากลับไม่เปลี่ยนแปลงอะไรเลย - join กับลิสต์ของตัวเลข ได้
TypeErrorให้ใช้map(str, ...)ก่อน - strip กับข้อความย่อย อาร์กิวเมนต์คือชุดอักขระ สำหรับคำนำหน้าให้ใช้
removeprefix() - การเปรียบเทียบที่สนตัวพิมพ์
"Latte" == "latte"ได้False - แบ็กสแลชในพาธ Windows หากไม่มีคำนำหน้า
rจะกลายเป็นอักขระพิเศษ
t-string: เทมเพลตแทนข้อความสำเร็จรูป
Python 3.14 เพิ่ม t-string ซึ่งหน้าตาคล้าย f-string แต่ใช้คำนำหน้า t และผลลัพธ์ต่างออกไป ได้เป็นออบเจกต์ string.templatelib.Template ไม่ใช่สตริงสำเร็จรูป โดยส่วนข้อความ (.strings) และค่าที่แทรก (.values) จะถูกเก็บแยกกัน
name = "<script>"
tpl = t"สวัสดี {name}!"
print(tpl.strings) # ('สวัสดี ', '!')
print(tpl.values) # ('<script>',)
ประโยชน์คือไลบรารีได้รับค่าก่อนการต่อสตริง และสามารถประมวลผลได้ เช่น escape เครื่องหมาย < > สำหรับ HTML หรือส่งพารามิเตอร์เข้า SQL อย่างถูกต้อง f-string ไม่มีโอกาสนี้ เพราะต่อสตริงไปแล้วทั้งหมด สำหรับการแสดงผลธรรมดายังใช้ f-string ได้ตามเดิม
สรุป
สำหรับงานสตริงประจำวันใน Python ใช้เครื่องมือไม่กี่ตัว: split() กับ join() แยกและรวมข้อความ strip() ทำความสะอาดข้อมูลที่รับเข้า replace() แทนที่ชิ้นส่วน การ slice ตัดข้อความย่อย และ f-string แสดงค่าตามรูปแบบที่ต้องการ จำไว้ว่าสตริงแก้ไขไม่ได้ เมธอดคืนสตริงใหม่ ซึ่งต้องเก็บผลลัพธ์ไว้ สตริง ตัวเลข และ f-string ถูกสาธิตผ่านโปรแกรมบันทึกค่าใช้จ่ายในบทเรียนของคอร์ส Python
คำถามที่พบบ่อย
จะรู้ความยาวของสตริงใน 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 ที่เก็บส่วนข้อความและค่าแยกกัน ทำให้ escape ข้อมูลสำหรับ HTML และ SQL ได้อย่างปลอดภัย
หัวข้อนี้สอนอย่างละเอียดพร้อมฝึกปฏิบัติในคอร์ส “Python 3.15: от новичка до профи”
ไปที่คอร์ส