φυβλαςのβλογ
บล็อกของ phyblas



ภาษา python เบื้องต้น บทที่ ๑๑: การจัดการกับสายอักขระ
เขียนเมื่อ 2016/03/05 14:19
แก้ไขล่าสุด 2024/02/22 11:02
 

ในบทที่ผ่านๆมาได้อธิบายถึงเรื่องของสายอักขระไปพอสมควรแล้ว อย่างไรก็ตามยังมีอีกหลายอย่างที่ควรจะรู้ ในบทนี้จะพูดถึงอีกหลายอย่าง



ความยาวของสายอักขระ

สายอักขระอาจยาวเท่าใดก็ได้ การหาความยาวของสายอักขระทำได้เช่นเดียวกับลิสต์หรือทูเพิล คือใช้ฟังก์ชัน len
print(len('กขคงจ')) # ได้ 5

สายอักขระอาจจะมีความยาวเป็นศูนย์ก็ได้ ซึ่งเขียนแทนด้วยเครื่องหมายคำพูดติดกันสองตัวโดยไม่มีอะไรข้างใน
print(len('')) # ได้ 0

ช่องว่างจะถูกนับรวมความยาวด้วย ต่อให้ไม่ได้อยู่ตรงกลางก็ตาม
print(len('  ')) # ได้ 2

ภายในสายอักขระอักษรทุกตัวมีความยาวตัวละหน่วยเท่ากันหมด ไม่ว่าจะเป็นอักษรอะไรก็ตาม จะเป็นอักษร ASCII หรือไม่ก็ตาม

***สำหรับในไพธอน 2 จะแตกต่างออกไป
>>> รายละเอียด



การเข้าถึงสมาชิกของสายอักขระ

สายอักขระก็เป็นข้อมูลชนิดลำดับเช่นเดียวกับลิสต์หรือทูเพิล ดังนั้นสามารถเข้าถึงข้อมูลได้โดยใส่ลำดับสมาชิกในวงเล็บเหลี่ยม
a = 'bestuurdersaansprakelijkheidsverzekering'
print(a[0]) # ได้ b
print(a[-1]) # ได้ g
print(a[int(len(a)/2)]) # ได้ l

สามารถเข้าถึงทีละหลายตัวด้วยการใช้ : เช่นกัน
a[29:40] # ได้ verzekering
a[0:40:2] # ได้ 'bsuresasrkljhisezkrn'



การแก้ไขและเพิ่มข้อความในสายอักขระ

สายอักขระไม่สามารถแก้ไขข้อมูลอะไรได้ เช่นเดียวกับทูเพิล
b = 'เขาเป็นคนป่วย'
b[9:11] = 'ร' # ได้ TypeError: 'str' object does not support item assignment

แม้ว่าจะไม่สามารถแก้ไขข้อความข้างในได้ แต่ก็สามารถสร้างใหม่ทับตัวเก่าได้
b = b[:9]+'ร'+b[11:]
print(b) # ได้ เขาเป็นคนรวย 

ส่วนการเพิ่มข้อความในสายอักขระก็ทำได้โดยเอาสายอักขระเดิมมาบวกกับสิ่งที่ต้องการเพิ่ม
c = 'เขาเป็นคนดี'
c += 'แต่พูด'
print(c) # ได้ เขาเป็นคนดีแต่พูด 



การเปรียบเทียบสายอักขระ

สายอักขระสามารถนำมาทำการเปรียบเทียบเพื่อหาค่าความจริงเท็จได้โดย เมื่อใช้เครื่องหมาย == จะให้ค่าเป็นจริงต่อเมื่อเหมือนกันทุกตัวอักษร
print('J' == 'j') # False เพราะพิมพ์เล็กกับพิมพ์ใหญ่ถือเป็นคนละตัว
print('J' == 'j'.upper()) #True

เมื่อใช้เปรียบเทียบมากกว่า > หรือน้อยกว่า < จะเปรียบเทียบลำดับภายในยูนิโค้ดของอักษรนั้นทีละตัว โดยเลขที่มาก่อนถือว่าค่าน้อยกว่า หากเหมือนกันจึงจะพิจารณาตัวต่อไป
print('11' > '2') # False เพราะเลข 1 เทียบกับ 2 ก่อน
print('A' > 'a') # False เพราะตัวพิมพ์ใหญ่มาก่อนตัวพิมพ์เล็ก
print('ü' > 'z') # True เพราะ z เป็น ASCII แต่ ü ไม่ใช่
print('ม' > '美') # False เพราะอักษรไทยมาก่อนอักษรจีนในยูนิโค้ด
print('ア' > 'あ') # True เพราะฮิรางานะมาก่อนคาตาคานะ



การตัดช่องว่างหัวท้าย

ช่องว่างที่หัวท้ายของสายอักขระสามารถทำให้หายไปได้โดยใช้เมธอด .strip
print(len('  แม่นแล้ว  ')) # ได้ 13
print('  แม่นแล้ว  '.strip()) # ได้ แม่นแล้ว
print(len('  แม่นแล้ว  '.strip())) # ได้ 8 
หากต้องการตัดแค่หัวหรือท้ายอย่างเดียวก็ใช้ .lstrip หรือ .rstrip โดย .lstrip จะตัดเฉพาะหัว ส่วน .rstrip จะตัดเฉพาะท้าย
print(len('  แม่นแล้ว   '.lstrip())) # ได้ 11
print(len('  แม่นแล้ว   '.rstrip())) # ได้ 10



การแบ่งและเชื่อมรวมสายอักขระ

สามารถแยกสายอักขระออกเป็นส่วนๆได้ด้วยเมธอด .split โดยเมธอดนี้จะสร้างลิสต์ของสายอักขระแต่ละส่วนที่แยกได้ออกมา

โดยในการแยกจำเป็นต้องระบุว่าจะใช้สัญลักษณ์อะไรเป็นตัวแยก โดยใส่เป็นอาร์กิวเมนต์ในเมธอด เช่นหากต้องการให้แยกตามจุลภาพ ,
it = 'pasta, spaghetti, macaroni, lasagna, pizza'
ita = it.split(', ')
print(ita) # ได้ ['pasta', 'spaghetti', 'macaroni', 'lasagna', 'pizza']

หากไม่ใส่อาร์กิวเมนต์อะไรลงในเมธอดเลยจะแยกตามช่องว่าง
fr = 'croissant baguette  éclair     macaron madeleine'
fra = fr.split()
print(fra) # ได้ ['croissant', 'baguette', 'éclair', 'macaron', 'madeleine']

ในทางตรงข้ามมีเมธอดที่ชื่อ .join เอาไว้ใช้รวมลิสต์ของสายอักขระเข้าเป็นสายอักขระอันเดียว

.join นั้นถือเป็นเมธอดของสายอักขระโดยทำกับสายอักขระที่เป็นตัวคั่นแล้วมีอาร์กิวเมนต์เป็นลิสต์ของสายอักขระที่ต้องการรวม

วิธีการใช้อาจดูแล้วเข้าใจยากกว่า .split อยู่หน่อยและอาจสับสนกันได้ ให้ดูตัวอย่างประกอบ
f = ['ยานี้ดี', 'กินแล้วแข็ง', 'แรงไม่มี', 'โรคภัยไข้เจ็บเบียดเบียน']
g = ''.join(f)
print(g) # ได้ ยานี้ดีกินแล้วแข็งแรงไม่มีโรคภัยไข้เจ็บเบียดเบียน

ลองเขียนโปรแกรมสำหรับเชื่อมโดยไม่ใช้ .join ดูก็สามารถทำได้
f = ['ยานี้ดี', 'กินแล้วแข็ง', 'แรงไม่มี', 'โรคภัยไข้เจ็บเบียดเบียน']
g = ''
for s in f:
    g += s
print(g) 

ตัวเชื่อมอาจใช้เป็นอะไรก็ได้ เช่นเว้นวรรคก็ใช้ \n
h = '\n'.join(['ooo','o o','ooo'])
print(h)

จะได้สายอักขระที่มี ๓ บรรทัด
ooo
o o
ooo

สำหรับการแยกสายอักขระโดยใช้การขึ้นบรรทัดใหม่เป็นตัวแยกอาจใช้เมธอด .splitlines เช่นลองใช้กับสายอักขระตัวเมื่อครู่
print(h.splitlines()) # ได้กลับมาเป็น ['ooo', 'o o', 'ooo']

หากต้องการแยกสายอักขระออกเป็นทีละตัวๆก็อาจทำได้ง่ายๆด้วยการใช้ list แปลงเป็นลิสต์ได้เลย
print(list('กลุ่มก้อน')) # ได้ ['ก', 'ล', 'ุ', '่', 'ม', 'ก', '้', 'อ', 'น']



การเปลี่ยนตัวพิมพ์ใหญ่พิมพ์เล็ก

อักษรโรมันมักประกอบไปด้วยตัวพิมพ์เล็กและพิมพ์ใหญ่ ในภาษาไพธอนมีคำสั่งสำหรับเปลี่ยนข้อความในสายอักขระทั้งหมดเป็นพิมพ์เล็ก หรือพิมพ์ใหญ่ทั้งหมด นั่นคือใช้เมธอด .upper และ .lower
a = 'Die Flügel der Freiheit'
print(a.upper()) # ได้ DIE FLÜGEL DER FREIHEIT
print(a.lower()) # ได้ die flügel der freiheit

อักษรกรีกเองก็มีตัวพิมพ์เล็กพิมพ์ใหญ่ สามารถใช้ได้ด้วย
a = 'Αστρονομία'
print(a.upper()) # ΑΣΤΡΟΝΟΜΊΑ
print(a.lower()) # αστρονομία

***แต่ถ้าใช้ในไพธอน 2 มีข้อต้องระวัง
>>> อ่านรายละเอียด

สำหรับอักษรไทยไม่มีตัวพิมพ์เล็กพิมพ์ใหญ่จึงไม่มีผลอะไรกับเมธอดนี้

ลองเขียนโปรแกรมให้สร้างสายอักขระขึ้นใหม่โดยเปลี่ยนคำที่เป็นตัวพิมพ์เล็กทั้งหมดให้เป็นตัวพิมพ์ใหญ่สลับกับตัวพิมพ์เล็ก
a = 'pneumoultramicroscopicossilicovulcanoconioticozinhos'
b = ''
for i in range(0,len(a),2):
    b += a[i].upper()
    if(i<len(a)-1): b += a[i+1]
print(b) # ได้ PnEuMoUlTrAmIcRoScOpIcOsSiLiCoVuLcAnOcOnIoTiCoZiNhOs



การค้นหาข้อความที่ต้องการภายในสายอักขระ

การจะตรวจว่าข้อความสั้นๆที่เราต้องการค้นนั้นอยู่ภายในสายอักขระยาวๆหรือไม่สามารถใช้ in เช่น
'Essen' in 'Sie sind das Essen und wir sind die Jäger' # ได้ True 

หากต้องการหาว่าคำที่ต้องการนั้นอยู่ในตำแหน่งไหนก็อาจทำการวนซ้ำเพื่อค้น เช่น
g = 'Sie sind das Essen und wir sind die Jäger'
s = 'Essen'
if(s in guren):
    for i in range(len(g)):
        if(s not in g[i:]):
            print(i-1)
            break
else: print('ไม่พบคำที่ต้องการหา')

ผลลัพธ์จะได้ 13

อย่างไรก็ตามในภาษาไพธอนมีคำสั่งที่สามารถช่วยค้นหาได้โดยอัตโนมัติอยู่ นั่นคือ .find

โครงสร้าง
สายอักขระ.find(คำที่ค้น, จุดเริ่มค้น, จุดสิ้นสุดการค้น)

โดยที่จุดเริ่มต้นและสิ้นสุดอาจใส่หรือไม่ใส่ก็ได้ ถ้าไม่ใส่ก็จะค้นทั้งหมด
g = 'Sie sind das Essen und wir sind die Jäger'
print(g.find('Essen')) # ได้ 13

หากค้นหาแล้วไม่พบ จะคืนค่า -1
print(g.find('der')) # ได้ -1

กรณีที่มีคำที่ค้นอยู่ ๒ ตัวขึ้นไป จะขึ้นตำแหน่งของตัวแรก
print(g.find('sind')) # ได้ 4

หากต้องการให้ค้นไล่มาจากด้านหลังให้ใช้เมธอด .rfind
print(g.rfind('sind')) # ได้ 27

กรณีที่กำหนดจุดเริ่มต้นและจุดสิ้นสุด ถ้าตัวที่ต้องการหาไม่อยู่ในขอบเขตก็จะหาไม่พบ
print(g.find('Sie',3)) # ได้ -1 (คือหาไม่พบ)
print(g.find('die',2,35)) # ได้ 32
print(g.find('die',2,32)) # ได้ -1 (คือหาไม่พบ)

นอกจากนี้ยังมีเมธอด .index และ .rindex ซึ่งก็ใช้ค้นหาเหมือนกัน แต่ความต่างคือหากค้นหาแล้วไม่เจอจะขึ้นขัดข้องแทนที่จะคืนค่า -1
print(g.index('Eren')) # ได้ ValueError: substring not found 

หากต้องการนับจำนวนคำที่ต้องการค้นว่ามีทั้งหมดกี่ตัวสามารถใช้เมธอด .count
print(g.count('sind')) # ได้ 2



ตรวจจุดเริ่มและจุดสิ้นสุด

ในการตรวจว่าข้อความขึ้นต้นและสิ้นสุดเป็นตัวที่ต้องการหรือไม่นั้น มีเมธอดเฉพาะที่สามารถใช้ได้ คือ .startswith กับ .endswith

โครงสร้าง
สายอักขระ.startswith(คำที่ค้น, จุดเริ่มค้น, จุดสิ้นสุดการค้น)
สายอักขระ.endswith(คำที่ค้น, จุดเริ่มค้น, จุดสิ้นสุดการค้น)

ตัวอย่าง
a = 'verbrennungsanlage'
print(a.startswith('ver')) # ได้ True
print(a.startswith('ver',3)) # ได้ False
print(a.startswith('bren',3)) # ได้ True
print(a.startswith('erb',1,7)) # ได้ True
print(a.endswith('sanlage')) # ได้ True
print(a.endswith('nung',7)) # ได้ False
print(a.endswith('san',3,14)) # ได้ True
print(a.endswith('san',12,14)) # ได้ False 



การแทนที่

สามารถค้นหาอักษรที่ต้องการแล้วเขียนทับได้โดยใช้เมธอด .replace

โครงสร้าง
สายอักขระ.replace(ข้อความที่จะให้ถูกแทนที่,ข้อความที่จะนำไปแทน,จำนวนที่จะแทน)

จำนวนที่แทนอาจไม่จำเป็นต้องใส่ก็ได้ หากไม่ใส่มีกี่ตัวก็จะถูกแทนหมด

ตัวอย่าง
v = 'ไก่จิกเด็กตายเด็กตายบนปากโอ่ง'
print(v.replace('เด็กตาย','เด็กเต้น')) # ได้ ไก่จิกเด็กเต้นเด็กเต้นบนปากโอ่ง

กรณีที่กำหนดจำนวนก็จะถูกแทนแค่จำนวนนั้น
print(v.replace('เด็กตาย','โดนเตียง',1)) # ได้ ไก่จิกโดนเตียงเด็กตายบนปากโอ่ง

กรณีที่อยากลบข้อความก็ทำได้โดยปล่อยว่าง
print(v.replace('จิกเด็กตายเด็ก','')) # ได้ ไก่ตายบนปากโอ่ง



อ้างอิง




-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文