Python 3 - นิพจน์ทั่วไป

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

โมดูล reให้การสนับสนุนอย่างเต็มที่สำหรับนิพจน์ทั่วไปเหมือน Perl ใน Python re โมดูลทำให้เกิดข้อยกเว้น re.error หากเกิดข้อผิดพลาดขณะคอมไพล์หรือใช้นิพจน์ทั่วไป

เราจะกล่าวถึงฟังก์ชันที่สำคัญสองอย่างซึ่งจะใช้ในการจัดการกับนิพจน์ทั่วไป อย่างไรก็ตามสิ่งเล็ก ๆ ก่อน: มีอักขระหลายตัวซึ่งจะมีความหมายพิเศษเมื่อใช้ในนิพจน์ทั่วไป เพื่อหลีกเลี่ยงความสับสนขณะจัดการกับนิพจน์ทั่วไปเราจะใช้ Raw Strings เป็นr'expression'.

รูปแบบพื้นฐานที่ตรงกับอักขระเดี่ยว

ซีเนียร์ นิพจน์และการจับคู่
1

a, X, 9, <

อักขระธรรมดาก็ตรงกับตัวเองทุกประการ

2

. (a period)

จับคู่อักขระเดี่ยวใด ๆ ยกเว้นขึ้นบรรทัดใหม่ '\ n'

3

\w

จับคู่อักขระ "word": ตัวอักษรหรือตัวเลขหรือขีดล่าง [a-zA-Z0-9_]

4

\W

จับคู่อักขระที่ไม่ใช่คำใด ๆ

5

\b

ขอบเขตระหว่างคำและไม่ใช่คำ

6

\s

จับคู่อักขระช่องว่างเดียว - เว้นวรรค, ขึ้นบรรทัดใหม่, ย้อนกลับ, แท็บ

7

\S

จับคู่อักขระที่ไม่ใช่ช่องว่างใด ๆ

8

\t, \n, \r

แท็บขึ้นบรรทัดใหม่ย้อนกลับ

9

\d

เลขฐานสิบ [0-9]

10

^

ตรงกับจุดเริ่มต้นของสตริง

11

$

จับคู่ส่วนท้ายของสตริง

12

\

ยับยั้ง "ความพิเศษ" ของตัวละคร

แฟล็กการคอมไพล์

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

ซีเนียร์ ธงและความหมาย
1

ASCII, A

ทำให้หลาย Escape เช่น \ w, b, \ s และ \ d จับคู่กับอักขระ ASCII ที่มีคุณสมบัติตามลำดับเท่านั้น

2

DOTALL, S

จับคู่อักขระใด ๆ รวมทั้งขึ้นบรรทัดใหม่

3

IGNORECASE, I

ทำการจับคู่แบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่

4

LOCALE, L

ทำการจับคู่ที่ทราบภาษา

5

MULTILINE, M

การจับคู่หลายบรรทัดส่งผลต่อ ^ และ $

6

VERBOSE, X (for ‘extended’)

เปิดใช้งาน REs แบบละเอียดซึ่งสามารถจัดระเบียบได้อย่างสะอาดตาและเข้าใจได้ง่ายขึ้น

ฟังก์ชั่นการจับคู่

ฟังก์ชั่นนี้ความพยายามเพื่อให้ตรงกับ RE รูปแบบเพื่อสตริงที่มีตัวธง

นี่คือไวยากรณ์สำหรับฟังก์ชันนี้ -

re.match(pattern, string, flags = 0)

นี่คือคำอธิบายของพารามิเตอร์ -

ซีเนียร์ พารามิเตอร์และคำอธิบาย
1

pattern

นี่คือนิพจน์ทั่วไปที่จะจับคู่

2

string

นี่คือสตริงซึ่งจะถูกค้นหาเพื่อให้ตรงกับรูปแบบที่จุดเริ่มต้นของสตริง

3

flags

คุณสามารถระบุแฟล็กต่างๆโดยใช้บิตหรือ (|) นี่คือตัวดัดแปลงซึ่งแสดงอยู่ในตารางด้านล่าง

re.matchผลตอบแทนที่ฟังก์ชั่นmatch คัดค้านความสำเร็จ Noneเมื่อล้มเหลว เราใช้ฟังก์ชันgroup (num)หรือgroups ()ของmatch วัตถุเพื่อให้ได้นิพจน์ที่ตรงกัน

ซีเนียร์ วิธีจับคู่วัตถุและคำอธิบาย
1

group(num = 0)

วิธีนี้ส่งคืนการจับคู่ทั้งหมด (หรือตัวเลขกลุ่มย่อยเฉพาะ)

2

groups()

วิธีนี้จะส่งคืนกลุ่มย่อยที่ตรงกันทั้งหมดในทูเพิล (ว่างเปล่าถ้าไม่มี)

ตัวอย่าง

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

ฟังก์ชันการค้นหา

นี้ฟังก์ชันการค้นหาเกิดขึ้นครั้งแรกของ RE รูปแบบภายในสตริงที่มีตัวธง

นี่คือไวยากรณ์สำหรับฟังก์ชันนี้ -

re.search(pattern, string, flags = 0)

นี่คือคำอธิบายของพารามิเตอร์ -

ซีเนียร์ พารามิเตอร์และคำอธิบาย
1

pattern

นี่คือนิพจน์ทั่วไปที่จะจับคู่

2

string

นี่คือสตริงซึ่งจะถูกค้นหาเพื่อให้ตรงกับรูปแบบที่ใดก็ได้ในสตริง

3

flags

คุณสามารถระบุแฟล็กต่างๆโดยใช้บิตหรือ (|) นี่คือตัวดัดแปลงซึ่งแสดงอยู่ในตารางด้านล่าง

re.searchผลตอบแทนที่ฟังก์ชั่นmatch คัดค้านความสำเร็จ noneเมื่อล้มเหลว เราใช้ฟังก์ชันgroup (num)หรือgroups ()ของmatch วัตถุเพื่อให้ได้นิพจน์ที่ตรงกัน

ซีเนียร์ วิธีจับคู่วัตถุและคำอธิบาย
1

group(num = 0)

วิธีนี้ส่งคืนการจับคู่ทั้งหมด (หรือตัวเลขกลุ่มย่อยเฉพาะ)

2

groups()

วิธีนี้จะส่งคืนกลุ่มย่อยที่ตรงกันทั้งหมดในทูเพิล (ว่างเปล่าถ้าไม่มี)

ตัวอย่าง

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("Nothing found!!")

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

การจับคู่กับการค้นหา

Python นำเสนอการดำเนินการดั้งเดิมสองแบบที่แตกต่างกันตามนิพจน์ทั่วไป: match ตรวจสอบการจับคู่เฉพาะที่จุดเริ่มต้นของสตริงในขณะที่ search ตรวจสอบการจับคู่ที่ใดก็ได้ในสตริง (นี่คือสิ่งที่ Perl ทำโดยค่าเริ่มต้น)

ตัวอย่าง

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print ("match --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")

searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print ("search --> searchObj.group() : ", searchObj.group())
else:
   print ("Nothing found!!")

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

No match!!
search --> matchObj.group() :  dogs

ค้นหาและแทนที่

ที่สำคัญที่สุดอย่างหนึ่ง re วิธีการที่ใช้นิพจน์ทั่วไปคือ sub.

ไวยากรณ์

re.sub(pattern, repl, string, max=0)

วิธีการนี้จะแทนที่เกิดขึ้นทั้งหมดของ RE รูปแบบในสตริงกับreplแทนเหตุการณ์ทั้งหมดเว้นแต่สูงสุดที่มีให้ วิธีนี้ส่งคืนสตริงที่แก้ไข

ตัวอย่าง

#!/usr/bin/python3
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print ("Phone Num : ", num)

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Phone Num :  2004-959-559
Phone Num :  2004959559

การปรับเปลี่ยนนิพจน์ทั่วไป: แฟล็กตัวเลือก

ลิเทอรัลนิพจน์ทั่วไปอาจรวมถึงโมดิฟายเออร์เสริมเพื่อควบคุมลักษณะต่างๆของการจับคู่ ตัวดัดแปลงถูกระบุเป็นแฟล็กทางเลือก คุณสามารถให้ตัวดัดแปลงหลายตัวโดยใช้เฉพาะ OR (|) ดังที่แสดงไว้ก่อนหน้านี้และอาจแสดงโดยหนึ่งในนั้น -

ซีเนียร์ ตัวปรับแต่งและคำอธิบาย
1

re.I

ทำการจับคู่แบบไม่คำนึงถึงขนาดตัวพิมพ์

2

re.L

แปลความหมายของคำตามภาษาปัจจุบัน การตีความนี้มีผลต่อกลุ่มตัวอักษร (\ w และ \ W) รวมถึงพฤติกรรมขอบเขตคำ (\ b และ \ B)

3

re.M

ทำให้ $ ตรงกับจุดสิ้นสุดของบรรทัด (ไม่ใช่แค่จุดสิ้นสุดของสตริง) และทำให้ ^ ตรงกับจุดเริ่มต้นของบรรทัดใด ๆ (ไม่ใช่แค่จุดเริ่มต้นของสตริง)

4

re.S

ทำให้จุด (จุด) ตรงกับอักขระใด ๆ รวมถึงขึ้นบรรทัดใหม่

5

re.U

ตีความตัวอักษรตามชุดอักขระ Unicode แฟล็กนี้มีผลต่อพฤติกรรมของ \ w, \ W, \ b, B

6

re.X

อนุญาตให้ใช้ไวยากรณ์นิพจน์ทั่วไปที่ "น่ารักกว่า" โดยจะละเว้นช่องว่าง (ยกเว้นภายในชุด [] หรือเมื่อใช้เครื่องหมายแบ็กสแลชที่หลีกเลี่ยง) และถือว่า # ที่ไม่ใช้ Escape เป็นเครื่องหมายแสดงความคิดเห็น

รูปแบบนิพจน์ทั่วไป

ยกเว้นอักขระควบคุม (+ ? . * ^ $ ( ) [ ] { } | \)อักขระทั้งหมดตรงกับตัวเอง คุณสามารถหลีกเลี่ยงอักขระควบคุมได้โดยนำหน้าด้วยแบ็กสแลช

ตารางต่อไปนี้แสดงรายการไวยากรณ์ของนิพจน์ทั่วไปที่มีอยู่ใน Python -

ซีเนียร์ พารามิเตอร์และคำอธิบาย
1

^

ตรงกับจุดเริ่มต้นของบรรทัด

2

$

ตรงกับจุดสิ้นสุดของบรรทัด

3

.

จับคู่อักขระเดี่ยวใด ๆ ยกเว้นขึ้นบรรทัดใหม่ การใช้ตัวเลือก m ช่วยให้จับคู่ขึ้นบรรทัดใหม่ได้เช่นกัน

4

[...]

จับคู่อักขระเดี่ยวใด ๆ ในวงเล็บ

5

[^...]

จับคู่อักขระเดี่ยวใด ๆ ที่ไม่อยู่ในวงเล็บ

6

re*

จับคู่ 0 หรือมากกว่าที่เกิดขึ้นของนิพจน์ก่อนหน้า

7

re+

จับคู่นิพจน์ก่อนหน้าอย่างน้อย 1 รายการ

8

re?

จับคู่นิพจน์ที่อยู่ก่อนหน้า 0 หรือ 1 ครั้ง

9

re{ n}

ตรงกับจำนวน n ของนิพจน์ที่เกิดขึ้นก่อนหน้า

10

re{ n,}

จับคู่ n เหตุการณ์หรือมากกว่าที่เกิดขึ้นก่อนหน้า

11

re{ n, m}

จับคู่อย่างน้อย n และมากที่สุด m ที่เกิดขึ้นของนิพจน์ก่อนหน้า

12

a|b

จับคู่ a หรือ b

13

(re)

จัดกลุ่มนิพจน์ทั่วไปและจดจำข้อความที่ตรงกัน

14

(?imx)

สลับตัวเลือก i, m หรือ x ชั่วคราวภายในนิพจน์ทั่วไป หากอยู่ในวงเล็บจะมีผลเฉพาะพื้นที่นั้นเท่านั้น

15

(?-imx)

ปิดตัวเลือก i, m หรือ x ชั่วคราวภายในนิพจน์ทั่วไป หากอยู่ในวงเล็บจะมีผลเฉพาะพื้นที่นั้นเท่านั้น

16

(?: re)

จัดกลุ่มนิพจน์ทั่วไปโดยไม่จำข้อความที่ตรงกัน

17

(?imx: re)

สลับตัวเลือก i, m หรือ x ชั่วคราวภายในวงเล็บ

18

(?-imx: re)

ปิดตัวเลือก i, m หรือ x ชั่วคราวภายในวงเล็บ

19

(?#...)

แสดงความคิดเห็น.

20

(?= re)

ระบุตำแหน่งโดยใช้รูปแบบ ไม่มีช่วง

21

(?! re)

ระบุตำแหน่งโดยใช้การปฏิเสธรูปแบบ ไม่มีช่วง

22

(?> re)

จับคู่รูปแบบอิสระโดยไม่ต้องย้อนรอย

23

\w

จับคู่อักขระคำ

24

\W

จับคู่อักขระที่ไม่ใช่คำหลัก

25

\s

ตรงกับช่องว่าง เทียบเท่ากับ [\ t \ n \ r \ f]

26

\S

ตรงกับ nonwhitespace

27

\d

ตรงกับตัวเลข เทียบเท่ากับ [0-9]

28

\D

ตรงกับ nondigits

29

\A

ตรงกับจุดเริ่มต้นของสตริง

30

\Z

ตรงกับจุดสิ้นสุดของสตริง หากมีขึ้นบรรทัดใหม่จะตรงกับก่อนขึ้นบรรทัดใหม่

31

\z

ตรงกับจุดสิ้นสุดของสตริง

32

\G

ตรงกับจุดที่นัดสุดท้ายจบ

33

\b

จับคู่ขอบเขตของคำเมื่ออยู่นอกวงเล็บ จับคู่ backspace (0x08) เมื่ออยู่ในวงเล็บ

34

\B

ตรงกับขอบเขตที่ไม่ใช่คำ

35

\n, \t, etc.

จับคู่การขึ้นบรรทัดใหม่การคืนค่าขนส่งแท็บ ฯลฯ

36

\1...\9

ตรงกับนิพจน์ย่อยที่จัดกลุ่มที่ n

37

\10

จับคู่นิพจน์ย่อยที่จัดกลุ่มที่ n ถ้าตรงกันแล้ว มิฉะนั้นหมายถึงการแทนค่าฐานแปดของรหัสอักขระ

ตัวอย่างนิพจน์ทั่วไป

อักขระตามตัวอักษร

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

python

ตรงกับ "python"

คลาสตัวละคร

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

[Pp]ython

จับคู่ "Python" หรือ "python"

2

rub[ye]

จับคู่ "ทับทิม" หรือ "รูบ"

3

[aeiou]

จับคู่สระตัวพิมพ์เล็กตัวใดตัวหนึ่ง

4

[0-9]

จับคู่ตัวเลขใด ๆ เหมือนกับ [0123456789]

5

[a-z]

จับคู่ตัวอักษร ASCII ตัวพิมพ์เล็ก

6

[A-Z]

จับคู่ตัวอักษร ASCII ตัวพิมพ์ใหญ่ใด ๆ

7

[a-zA-Z0-9]

ตรงกับข้อใด ๆ ข้างต้น

8

[^aeiou]

จับคู่สิ่งอื่นที่ไม่ใช่สระตัวพิมพ์เล็ก

9

[^0-9]

จับคู่สิ่งอื่นที่ไม่ใช่ตัวเลข

คลาสตัวละครพิเศษ

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

.

จับคู่อักขระใด ๆ ยกเว้นขึ้นบรรทัดใหม่

2

\d

จับคู่ตัวเลข: [0-9]

3

\D

จับคู่ nondigit: [^ 0-9]

4

\s

จับคู่อักขระเว้นวรรค: [\ t \ r \ n \ f]

5

\S

ตรงกับ nonwhitespace: [^ \ t \ r \ n \ f]

6

\w

จับคู่อักขระคำเดียว: [A-Za-z0-9_]

7

\W

จับคู่อักขระที่ไม่ใช่คำหลัก: [^ A-Za-z0-9_]

กรณีการทำซ้ำ

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

ruby?

จับคู่ "ถู" หรือ "ทับทิม": y เป็นทางเลือก

2

ruby*

จับคู่ "ถู" บวก 0 หรือมากกว่า ys

3

ruby+

จับคู่ "ถู" บวก 1 ys ขึ้นไป

4

\d{3}

จับคู่ 3 หลักทุกประการ

5

\d{3,}

จับคู่ 3 หลักขึ้นไป

6

\d{3,5}

จับคู่ 3, 4 หรือ 5 หลัก

การทำซ้ำ Nongreedy

สิ่งนี้ตรงกับจำนวนการทำซ้ำน้อยที่สุด -

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

<.*>

การทำซ้ำแบบโลภ: ตรงกับ "<python> perl>"

2

<.*?>

Nongreedy: ตรงกับ "<python>" ใน "<python> perl>"

การจัดกลุ่มด้วยวงเล็บ

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

\D\d+

ไม่มีกลุ่ม: + ซ้ำ \ d

2

(\D\d)+

จัดกลุ่ม: + ซ้ำ \ D \ d คู่

3

([Pp]ython(,)?)+

จับคู่ "Python", "Python, python, python" ฯลฯ

การอ้างอิงย้อนกลับ

สิ่งนี้จะจับคู่กลุ่มที่ตรงกันก่อนหน้านี้อีกครั้ง -

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

([Pp])ython&\1ails

จับคู่ python & pails หรือ Python & Pails

2

(['"])[^\1]*\1

สตริงเดี่ยวหรือคู่ \ 1 จับคู่กลุ่มแรกที่จับคู่ \ 2 ตรงกับกลุ่มที่ 2 ที่จับคู่ ฯลฯ

ทางเลือก

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

python|perl

จับคู่ "python" หรือ "perl"

2

rub(y|le)

จับคู่ "ทับทิม" หรือ "รูเบิล"

3

Python(!+|\?)

"Python" ตามด้วยอย่างน้อยหนึ่งตัว! หรือหนึ่ง?

จุดยึด

สิ่งนี้จำเป็นต้องระบุตำแหน่งที่ตรงกัน

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

^Python

จับคู่ "Python" ที่จุดเริ่มต้นของสตริงหรือบรรทัดภายใน

2

Python$

จับคู่ "Python" ที่ส่วนท้ายของสตริงหรือบรรทัด

3

\APython

จับคู่ "Python" ที่จุดเริ่มต้นของสตริง

4

Python\Z

จับคู่ "Python" ที่ส่วนท้ายของสตริง

5

\bPython\b

จับคู่ "Python" ที่ขอบเขตคำ

6

\brub\B

\ B คือขอบเขตที่ไม่ใช่คำ: จับคู่ "rub" ใน "rube" และ "ruby" แต่ไม่ใช่เพียงอย่างเดียว

7

Python(?=!)

จับคู่ "Python" หากตามด้วยเครื่องหมายอัศเจรีย์

8

Python(?!!)

จับคู่ "Python" หากไม่ตามด้วยเครื่องหมายอัศเจรีย์

ไวยากรณ์พิเศษพร้อมวงเล็บ

ซีเนียร์ ตัวอย่างและคำอธิบาย
1

R(?#comment)

ตรงกับ "R" ส่วนที่เหลือทั้งหมดเป็นความคิดเห็น

2

R(?i)uby

ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ขณะจับคู่ "uby"

3

R(?i:uby)

เช่นเดียวกับด้านบน

4

rub(?:y|le))

จัดกลุ่มเท่านั้นโดยไม่ต้องสร้าง backreference \ 1