ธงสำหรับสตริง Regular Expression ใน Python
เพื่อกำหนดธงเป็นหนึ่งในพารามิเตอร์ที่ไม่บังคับ สำหรับเมธอดต่างๆ ที่ทำงานกับ Regular Expression จะใช้ไวยากรณ์ต่อไปนี้:
flags=re.ชื่อธง
ธงหลักสำหรับทำงานกับ Regular Expression
| ธง | จุดประสงค์ |
|---|---|
re.IGNORECASE |
ไม่สนใจตัวพิมพ์ใหญ่-เล็กของตัวอักษร |
re.DOTALL |
จุดหมายถึงอักขระใดๆ รวมถึง การขึ้นบรรทัดใหม่ |
re.I |
ทำให้การค้นหาไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก |
re.L |
ค้นหาคำตามภาษาปัจจุบัน
การตีความนี้มีผลกับกลุ่มตัวอักษร
(\w และ \W) รวมถึง
พฤติกรรมของขอบเขตคำ (\b และ
\B)
|
re.M |
อักขระ $ ทำการค้นหาที่จุดสิ้นสุดของ
สตริงข้อความใดๆ (ไม่ใช่แค่จุดสิ้นสุดของข้อความทั้งหมด)
และอักขระ ^ ทำการค้นหาที่จุดเริ่มต้นของ
สตริงข้อความใดๆ (ไม่ใช่แค่จุดเริ่มต้นของ
ข้อความทั้งหมด)
|
re.S |
เปลี่ยนความหมายของจุด (.) ให้
ตรงกันกับอักขระใดๆ รวมถึงบรรทัดใหม่
|
re.U |
ตีความตัวอักษรตาม
ชุดอักขระ Unicode ธงนี้ส่งผลต่อ
พฤติกรรมของ \w, \W, \b,
\B ใน Python 3+ ธงนี้
ถูกตั้งค่าโดยค่าเริ่มต้น
|
re.X |
อนุญาตให้ใช้ไวยากรณ์ Regular Expression แบบหลายบรรทัด
มันจะละเว้นช่องว่างภายใน
รูปแบบ (ยกเว้นช่องว่างภายใน
เซต [] หรือเมื่อมีการหนีด้วย
แบ็กสแลช) และจัดการกับ
เครื่องหมาย '#' ที่ไม่ได้หนีเป็นความคิดเห็น
|
ตัวอย่าง
ด้วยการใช้ธง re.IGNORECASE คุณสามารถ
ไม่สนใจตัวพิมพ์ใหญ่-เล็กของตัวอักษรได้ มาดูกันว่า
ทำอย่างไร ในตัวอย่างนี้
Regular Expression จะค้นหาเฉพาะตัวพิมพ์เล็ก:
txt = 'aaa bbb CCC DDD'
res = re.sub('[a-z]+', '!', txt)
print(res)
ผลลัพธ์จากการรันโค้ด:
'! ! CCC DDD'
ตัวอย่าง
และตอนนี้ เพิ่มธง re.IGNORECASE ลงในพารามิเตอร์ที่สี่
ของเมธอด และ Regular Expression
จะเริ่มค้นหาอักขระในทุกตัวพิมพ์:
txt = 'aaa AAA bbb BBB'
res = re.sub('[a-z]+', '!', txt, flags=re.IGNORECASE)
print(res)
ผลลัพธ์จากการรันโค้ด:
'! ! ! !'
ตัวอย่าง
มาหาบรรทัดใหม่ทั้งหมดด้วย Regular Expression กัน:
txt = '''aaa
bbb'''
res = re.sub('\n', '!', txt)
print(res)
ผลลัพธ์จากการรันโค้ด:
'aaa!bbb'
ตัวอย่าง
แต่ถ้าต้องการแทนที่อักขระทั้งหมดจริงๆ การใส่จุดใน Regular Expression จะไม่จับ บรรทัดใหม่:
txt = '''aaa
bbb'''
res = re.sub('.', '!', txt)
print(res)
ผลลัพธ์จากการรันโค้ด:
'!!!
!!!'
ตัวอย่าง
เพื่อแก้ไขข้อผิดพลาดนี้ ควร
ใช้ธง re.DOTALL:
res = re.sub('.', '!', txt, flags=re.DOTALL)
print(res)
ผลลัพธ์จากการรันโค้ด:
'!!!!!!!'
ตัวอย่าง
ในพารามิเตอร์สามารถส่งผ่านได้หลาย
ธง โดยใส่โอเปอเรเตอร์ + ระหว่างธง
เริ่มต้นด้วยการแทนที่ตัวอักษร 'a'
ที่ท้ายสตริง:
txt = '''
aaa
AAA
aaa'''
res = re.sub('aaa
, '!', txt)
print(res)
ผลลัพธ์จากการรันโค้ด:
'''
aaa
AAA
!
'''
ตัวอย่าง
ตอนนี้ใส่ธง re.M:
res = re.sub('aaa
, '!', txt, flags=re.M)
print(res)
ผลลัพธ์จากการรันโค้ด:
'''
!
AAA
!
'''
ตัวอย่าง
ตอนนี้ลองใช้ธงสำหรับ ไม่สนใจตัวพิมพ์ใหญ่-เล็กด้วย:
res = re.sub('aaa
, '!', txt, flags=re.M+re.IGNORECASE)
print(res)
ผลลัพธ์จากการรันโค้ด:
'''
!
!
!
'''