φυβλαςのβλογ
บล็อกของ 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文