สตริงใน Python: สร้าง เข้าถึง ตัดช่วง และจัดการข้อความ
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
ลองนึกถึงโทรศัพท์ของคุณ เกือบทุกอย่างที่เห็นบนหน้าจอคือข้อความ ทั้งชื่อในรายชื่อติดต่อ ข้อความจากเพื่อน ผลการค้นหา และการแจ้งเตือน เบื้องหลังข้อความทั้งหมดนั้นจัดการด้วยสตริง
สตริง (string) คือวิธีที่ Python ใช้เก็บและทำงานกับข้อความ อาจเป็นตัวอักษรตัวเดียว ประโยคเต็ม ๆ หรือแม้แต่หนังสือทั้งเล่ม ถ้าเป็นข้อความ ก็คือสตริง
ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีสร้างสตริง ดึงอักขระที่ต้องการออกมา ตัดสตริงเป็นช่วง ต่อสตริงเข้าด้วยกัน และตรวจดูว่ามีอะไรอยู่ข้างใน ทักษะเหล่านี้จะได้ใช้ในแทบทุกโปรแกรม Python ที่คุณเขียน
สตริงใน Python คืออะไร
สตริง คือลำดับของอักขระที่อยู่ในเครื่องหมายคำพูด ใช้ได้ทั้งเครื่องหมายคำพูดเดี่ยว เครื่องหมายคำพูดคู่ หรือเครื่องหมายคำพูดสามตัว Python ถือว่าทั้งหมดเป็นสตริงเหมือนกัน
ลองนึกภาพสตริงเป็นสร้อยลูกปัด ลูกปัดแต่ละเม็ดคืออักขระหนึ่งตัว ส่วนเครื่องหมายคำพูดคือตะขอที่ยึดสร้อยไว้ด้วยกัน
Hello, world! Hello, world! Roses are red, Violets are blue, Python is awesome, And so are you.
เครื่องหมายคำพูดเดี่ยวและคู่ทำงานเหมือนกันทุกประการ เหตุผลหลักที่มีให้เลือกทั้งสองแบบคือความสะดวก ถ้าข้อความมีเครื่องหมายคำพูดแบบหนึ่งอยู่ข้างใน ก็ครอบข้อความด้วยอีกแบบหนึ่งได้
It's a beautiful day <div class="container">Hello</div>
แม้แต่เครื่องหมายคำพูดเปล่า ๆ หนึ่งคู่ก็สร้างสตริงได้ สตริงว่าง (empty string) มีอักขระ 0 ตัว แต่ก็ยังเป็นสตริงที่ถูกต้อง
<class 'str'> 0 1
จะเข้าถึงอักขระแต่ละตัวในสตริงได้อย่างไร
อักขระทุกตัวในสตริงมีหมายเลขตำแหน่งที่เรียกว่า ดัชนี (index) คุณดึงอักขระตัวใดก็ได้ออกมาโดยใส่ดัชนีของอักขระนั้นไว้ในวงเล็บเหลี่ยม
ส่วนที่สำคัญคือ Python เริ่มนับจาก 0 ไม่ใช่ 1 อักขระตัวแรกอยู่ที่ดัชนี 0 ตัวที่สองอยู่ที่ดัชนี 1 ไปเรื่อย ๆ แบบนี้เรียกว่าการนับดัชนีเริ่มจากศูนย์ (zero-based indexing)
P y n
ลองนึกถึงดัชนีของสตริงเหมือนบ้านเลขที่บนถนน บ้านหลังแรกคือเลขที่ 0 ไม่ใช่เลขที่ 1 ช่วงแรกอาจรู้สึกแปลก แต่จะชินได้เร็ว
ดัชนีติดลบใน Python คืออะไร
Python ยังให้นับถอยหลังจากท้ายสตริงได้ด้วย ดัชนีติดลบ (negative index) อักขระตัวสุดท้ายอยู่ที่ดัชนี -1 ตัวรองสุดท้ายอยู่ที่ -2 ไปเรื่อย ๆ
n o P
การตัดช่วงสตริงใน Python ทำงานอย่างไร
การใช้ดัชนีดึงอักขระออกมาหนึ่งตัว ส่วน การตัดช่วง (slicing) ดึงอักขระออกมาเป็นช่วง เหมือนการตัดขนมปังชิ้นหนึ่งออกจากกลางก้อน
รูปแบบคือ string[start:stop] ซึ่งดึงอักขระตั้งแต่ start ไปจนถึง (แต่ ไม่รวม) stop กฎ "ไปจนถึงแต่ไม่รวม" นี้เป็นหนึ่งในเรื่องที่สำคัญที่สุดที่ต้องจำ
Hello World H
คุณละค่า start หรือ stop ไว้ได้ ถ้าไม่ใส่ start Python จะเริ่มจากต้นสตริง ถ้าไม่ใส่ stop Python จะไปจนสุดท้ายสตริง
Hello World! Hello, World!
พารามิเตอร์ step ในการตัดช่วงทำงานอย่างไร
ยังมีตัวเลขตัวที่สามที่ใส่เพิ่มได้ คือ string[start:stop:step] โดย step กำหนดว่าจะกระโดดจากอักขระหนึ่งไปยังตัวถัดไปไกลเท่าไร ค่า step เป็น 2 จะดึงอักขระแบบเว้นหนึ่งตัว
acegi adgj bdfh
การใช้ step ที่รู้จักกันมากที่สุดคือ การกลับลำดับสตริง ค่า step เป็น -1 จะเดินถอยหลังผ่านสตริงทั้งหมด
nohtyP racecar
จะรวมสตริงใน Python ได้อย่างไร
การต่อสตริง (concatenation) คือการนำสตริงมาเชื่อมกัน ใน Python ใช้ตัวดำเนินการ + เหมือนการต่อตัวต่อเลโก้สองชิ้นเข้าด้วยกันให้ยาวขึ้น
Ada Lovelace Hello, world!
การทำซ้ำ (repetition) ใช้ตัวดำเนินการ * เพื่อทำซ้ำสตริงตามจำนวนครั้งที่กำหนด มีประโยชน์เกินคาดสำหรับการสร้างเส้นคั่น ลวดลาย หรือการเติมช่องว่าง
HaHaHa ------------------------------ abc abc abc abc My Report =========
จะหาความยาวของสตริงได้อย่างไร
ฟังก์ชัน len() บอกว่าในสตริงมีอักขระกี่ตัว โดยนับรวมตัวอักษร ตัวเลข ช่องว่าง และอักขระพิเศษ ทุกอักขระถูกนับหมด
13 5 0 n
จะตรวจว่ามีข้อความอยู่ในสตริงหรือไม่ได้อย่างไร
ตัวดำเนินการ in ตรวจว่าสตริงหนึ่งปรากฏอยู่ในอีกสตริงหนึ่งหรือไม่ และคืนค่า True หรือ False เหมือนการกด Ctrl+F เพื่อค้นหาคำในเอกสาร
True False True True
False True User said yes!
อักขระ escape ในสตริงของ Python คืออะไร
อักขระบางตัวพิมพ์ลงไปในสตริงตรง ๆ ไม่ได้ จะใส่การขึ้นบรรทัดใหม่ในสตริงได้อย่างไร หรือจะใส่แท็บอย่างไร คำตอบคือใช้ อักขระ escape (escape character) ซึ่งเป็นลำดับอักขระพิเศษที่ขึ้นต้นด้วยแบ็กสแลช \
Line 1 Line 2 Line 3 Name Age City Alice 25 Paris Bob 30 Tokyo File path: C:\Users\Documents She said "hello"
ตารางสรุปอักขระ escape ที่จะได้ใช้บ่อยที่สุด:
| Escape | ใช้ทำอะไร | ตัวอย่างผลลัพธ์ |
|---|---|---|
\n | ขึ้นบรรทัดใหม่ | ข้อความอยู่บนบรรทัดใหม่ |
\t | แท็บ | เพิ่มระยะเว้นแบบแท็บ |
\\ | แบ็กสแลช | แสดง \ หนึ่งตัว |
\" | เครื่องหมายคำพูดคู่ | แสดง " ภายในสตริงที่ใช้ " |
\' | เครื่องหมายคำพูดเดี่ยว | แสดง ' ภายในสตริงที่ใช้ ' |
ทำไมจึงเปลี่ยนอักขระในสตริงของ Python ไม่ได้
สตริงใน Python เปลี่ยนแปลงไม่ได้ (immutable) หมายความว่าเมื่อสร้างสตริงแล้ว จะเปลี่ยนอักขระตัวใดในนั้นไม่ได้เลย จะสลับตัวอักษรหรือแก้คำที่พิมพ์ผิดในสตริงที่มีอยู่แล้วก็ไม่ได้
ลองนึกถึงสตริงเหมือนหนังสือที่พิมพ์ออกมาแล้ว คุณอ่านหน้าไหนก็ได้ แต่ลบคำแล้วเขียนคำใหม่ลงไปไม่ได้ ถ้าอยากเปลี่ยนอะไร ต้องพิมพ์หนังสือเล่มใหม่
Error: 'str' object does not support item assignment
แล้วจะ "เปลี่ยน" สตริงได้อย่างไร คำตอบคือสร้างสตริง ใหม่ ที่มีการเปลี่ยนแปลงตามที่ต้องการ การตัดช่วงและการต่อสตริงทำให้เรื่องนี้ง่าย
word = "Hello"
word[0] = "J" # TypeError!word = "Hello"
new_word = "J" + word[1:]
print(new_word) # Jelloแบบฝึกหัด
ถึงเวลาฝึกแล้ว แบบฝึกหัดเหล่านี้ครอบคลุมทุกเรื่องในบทเรียนนี้ เริ่มจากข้อง่ายแล้วค่อย ๆ ยากขึ้น
ลองทำแต่ละข้อก่อนดูคำใบ้ การทำผิดและการอ่านข้อความแจ้งข้อผิดพลาดคือวิธีที่ทำให้เรียนรู้ได้จริง
มีตัวแปรให้สองตัว คือ first_name ที่มีค่าเป็น "Ada" และ last_name ที่มีค่าเป็น "Lovelace" ให้สร้างตัวแปรชื่อ greeting ที่รวมทั้งสองเป็นข้อความ แล้วแสดงผลออกมา
ผลลัพธ์ที่ต้องการ:
Hello, Ada Lovelace! Welcome to Python.ใช้การต่อสตริง (+) เพื่อสร้างคำทักทาย
มีตัวแปร word ที่มีค่าเป็น "Programming" ให้แสดงอักขระตัวแรกและตัวสุดท้ายคนละบรรทัด
ผลลัพธ์ที่ต้องการ:
P
gใช้ดัชนีของสตริงเพื่อเข้าถึงอักขระแต่ละตัว
มีตัวแปร text ที่มีค่าเป็น "Python" ให้แสดงสตริงนี้แบบกลับลำดับ
ผลลัพธ์ที่ต้องการ:
nohtyPใช้การตัดช่วงเพื่อกลับลำดับในขั้นตอนเดียว
โดยยังไม่รันโค้ด ให้ทายว่าแต่ละบรรทัดจะแสดงอะไร อย่าลืมว่าการตัดช่วงใช้ [start:stop] โดย stop ไม่ถูกรวม
เขียนคำทายของคุณเป็นคอมเมนต์ แล้วรันโค้ดเพื่อตรวจดู
โค้ดนี้พยายามแก้คำที่พิมพ์ผิดโดยเปลี่ยนอักขระโดยตรง แต่สตริงเปลี่ยนแปลงไม่ได้ โปรแกรมจึงหยุดทำงานพร้อมข้อผิดพลาด
แก้โค้ดให้แสดงผล:
Hello Worldสร้างสตริง ใหม่ แทนการแก้ไขสตริงเดิม
มี sentence และ search_word ให้ ตรวจว่าคำที่ค้นหามีอยู่ในประโยคหรือไม่ (แบบไม่สนตัวพิมพ์เล็กหรือใหญ่) แล้วแสดงผลลัพธ์
ผลลัพธ์ที่ต้องการ:
Trueแปลงทั้งสองให้เป็นตัวพิมพ์แบบเดียวกันก่อนตรวจ
มีที่อยู่อีเมลเก็บไว้ใน email ให้ดึงเฉพาะ ชื่อโดเมน (ส่วนที่อยู่หลังสัญลักษณ์ @) แล้วแสดงผลออกมา
ผลลัพธ์ที่ต้องการ:
gmail.comใช้เมธอด .find() หาตำแหน่งของสัญลักษณ์ @ แล้วใช้การตัดช่วงดึงทุกอย่างที่อยู่หลังสัญลักษณ์นั้นออกมา
สรุป: สตริงใน Python
ตารางสรุปทุกเรื่องที่ได้เรียนรู้:
| แนวคิด | รูปแบบ | ตัวอย่าง |
|---|---|---|
| สร้างสตริง | "text" หรือ 'text' | name = "Alice" |
| ดัชนี | string[i] | "Hello"[0] ได้ "H" |
| ดัชนีติดลบ | string[-i] | "Hello"[-1] ได้ "o" |
| การตัดช่วง | string[start:stop] | "Hello"[1:4] ได้ "ell" |
| การตัดช่วงแบบมี step | string[::step] | "Hello"[::-1] ได้ "olleH" |
| การต่อสตริง | + | "Hi" + " there" ได้ "Hi there" |
| การทำซ้ำ | * | "Ha" * 3 ได้ "HaHaHa" |
| ความยาว | len(string) | len("Hello") ได้ 5 |
| การตรวจว่าอยู่ในสตริงหรือไม่ | in | "fox" in "a fox" ได้ True |
| อักขระ escape | \n, \t, \\ | อักขระพิเศษในสตริง |
สิ่งสำคัญที่ต้องจำ: สตริง เปลี่ยนแปลงไม่ได้ คุณอ่านอักขระ ตัดช่วง ค้นหา และรวมสตริงได้ แต่จะเปลี่ยนสตริงในที่เดิมไม่ได้เลย ทุก "การเปลี่ยนแปลง" คือการสร้างสตริงใหม่ขึ้นมา
เรียนอะไรต่อ
ตอนนี้คุณสร้างและตัดช่วงสตริงได้แล้ว ถึงเวลาเรียนวิธีแปลงสตริง ในบทเรียนถัดไป เมธอดของสตริงใน Python คุณจะได้รู้จักเมธอดในตัว (built-in) เช่น .upper(), .replace(), .split() และ .strip() ที่ทำให้การทำงานกับข้อความเป็นเรื่องง่าย