Regular Expression (RegEx) trong Python

Chương kế tiếp đây của bài học kinh nghiệm khuếch trương tràn lan Python, Kênh Tin TT39 sẽ cùng bạn hướng đến về Regular Expression (RegEx) với module re cùng các tỉ dụ đơn cử để bạn dễ tưởng tượng và nắm bắt kĩ hơn kiến thức về RegEx. Cùng theo dấu nhé!

Regular Expression (RegEx) hay hay còn gọi bằng Biểu thức chính quy là 1 trong trong các số đoạn các ký tự nổi bật theo nhiều khuôn mẫu (pattern) nhất mực, thay mặt đại diện cho chuỗi hoặc một tập các chuỗi. Ví dụ:

^a...s$

Đoạn code trên cương quyết lề luật RegEx: bất kỳ chuỗi nào có năm vần âm, bắt đầu bằng a và cuối cùng bằng s.

Biểu thức Chuỗi tỉ dụ Mô tả
^a...s$ abs  Không phù vừa lòng vì chỉ bắt buộc 3 ký tự
alias  Phù vừa lòng
abyss  Phù vừa lòng
Alias  Không phù vừa lòng vì vần âm đầu viết hoa A
An abacus  Không phù vừa lòng vì vần âm đầu viết hoa A và dày hơn 5 ký tự

Regular Expression trong Python được nói lên qua module re, nên việc trước mắt khi anh chị em thích sử dụng Regular Expression thì sẽ càng phải import module re vào công tác làm công việc. Thử với tỉ dụ trên:

import re    pattern = '^a...s$'  test_string = 'abyss'  result = re.match(pattern, test_string)    if result:    print("Tim kiem thanh cong.")  else:    print("Tim kiem khong thanh cong.")

Ở đây các bạn vừa sử dụng hàm re.match() để tìm kiếm test_string tương ứng với pattern. Phương thức trả về đối tượng người sử dụng tương ứng nếu lọc kiếm thành công, trả về None còn nếu không tìm kiếm thấy.  

Hầu như ngôn ngữ nào thì cũng Tư vấn Regular Expression, kể đến như JavaScript, C#, Java, PHP, Ruby, SQL, Oracle, Perl… nhưng được sử dụng phổ cập nhất trong Unix/Linux.

Còn một vài hàm khác có trong mudule re để hoạt động giải trí với RegEx. Trước khi đi sâu vào các hàm này, hãy hướng đến kĩ hơn về biểu thức chính quy RegEx.

Cú pháp pattern sử dụng trong RegEx Python

Pattern ta hiểu là 1 trong trong các số đối tượng người sử dụng mẫu, một bạn dạng đang được biên dịch của 1 biểu thức chính quy. Để bắt buộc kiến nghị biểu thức chính quy, ta sử dụng các ký tự nổi bật, cho dù có:

[] . ^ $ * + ? {} () |

Trong tỉ dụ trên là ký tự ^$.

Dấu ngoặc vuông []

Dấu ngoặc vuông sử dụng để nói lên tập các ký tự bạn thích khớp.

Biểu thức Chuỗi tỉ dụ Mô tả
[abc] a  Khớp với ký tự a
ac  Khớp với ký tự a hoặc c
Hey Jude  Không khớp

Ở đây, [abc] sẽ khớp nếu chuỗi bạn truyền có chứa bất kỳ ký tự a, b hoặc c nào.

Bạn cũng rất có thể rất có thể bắt buộc kiến nghị một phạm vi các ký tự bằng phương pháp ăn - phía bên trong dấu ngoặc vuông.

  • [a-e] na ná với [abcde].
  • [1-4] na ná với [1234].
  • [0-39] na ná với [01239].

Nếu ký tự trước mắt của tập trung là ^ thì tất tật các ký tự không được định nghĩa trong tập trung sẽ có so khớp.

  • [^abc] nghĩa là khớp với các chuỗi không có ký tự a, b hay c.
  • [^0-9] nghĩa là khớp với các chuỗi không có ký tự chữ số nào.

Các ký tự nổi bật trong [] sẽ có cho như ký tự thông lệ.

  • [(+)] khớp với bất kỳ chuỗi nào có ký tự (, + hoặc ).

Dấu chấm .

Dấu chấm khớp với bất kỳ ký tự đơn thông lệ nào ngoại trừ ký tự tạo dòng mới 'n'.

Biểu thức Chuỗi tỉ dụ Mô tả
.. a  Không khớp vì chỉ bắt buộc một ký tự
ac  Khớp vì có hai ký tự
acd  Khớp vì có hai ký tự trở lên trên

Dấu mũ ^

Biểu tượng dấu mũ ^ được sử dụng để khớp ký tự thắng cuộc một chuỗi.

Biểu thức Chuỗi tỉ dụ Mô tả
^a a  Khớp vì bắt đầu bằng a
abc  Khớp vì bắt đầu bằng a
bac  Không khớp vì a không nằm tại đoạn trước mắt
^ab abc  Khớp vì bắt đầu bằng ab
acb  Không khớp, bắt đầu bằng a nhưng ký tự kế tiếp đây chưa hẳn b

Biểu tượng Dollar $

Biểu tượng Dollar $ được sử dụng để khớp ký tự cuối và một chuỗi.

Biểu thức Chuỗi tỉ dụ Mô tả
a$ a  Khớp vì cuối cùng bằng a
formula  Khớp vì cuối cùng bằng a
cab  Không khớp vì a không nằm tại đoạn vị trí cuối cùng

Dấu hoa thị *

Biểu tượng dấu hoa thị * rất có thể khớp với chuỗi có hoặc rất có thể là không có ký tự được định nghĩa trước nó. Ký tự này rất có thể được tái diễn nhiều lần mà khỏi bị số lượng giới hạn con số.

Biểu thức Chuỗi tỉ dụ Mô tả
ma*n mn  Khớp vì ký tự trước * rất có thể không sinh ra
man  Khớp vì có sinh ra đầy đủ các ký tự
maaaan  Khớp vì ký tự trước * rất có thể sinh ra nhiều lần
main  Không khớp vì không giống pattern, n không nằm kế a
woman  Khớp vì có sinh ra đầy đủ các ký tự

Dấu cộng +

Biểu tượng dấu cộng + rất có thể khớp với chuỗi có một hoặc nhiều ký tự được định nghĩa trước nó. Ký tự này rất có thể được tái diễn nhiều lần mà khỏi bị số lượng giới hạn con số.

Biểu thức Chuỗi tỉ dụ Mô tả
ma+n mn  Không khớp vì ký tự a trước + không sinh ra
man  Khớp vì có sinh ra đầy đủ các ký tự
maaaan  Khớp vì ký tự trước + rất có thể sinh ra nhiều lần
main  Không khớp vì không giống pattern, n không nằm kế a
woman  Khớp vì có sinh ra đầy đủ các ký tự

Dấu chấm hỏi ?

Biểu tượng dấu chấm hỏi rất có thể khớp với chuỗi có hoặc rất có thể là không có ký tự được định nghĩa trước nó. Ký tự này không có khả năng được tái diễn nhiều lần, chỉ số lượng giới hạn con số với một đợt sinh ra.

Biểu thức Chuỗi tỉ dụ Mô tả
ma?n mn  Khớp vì ký tự trước ? rất có thể không sinh ra
man  Khớp vì có sinh ra đầy đủ các ký tự
maaaan  Không khớp vì ký tự trước ? chỉ bắt buộc thể sinh ra 1 lần
main  Không khớp vì không giống pattern, n không nằm kế a
woman  Khớp vì có sinh ra đầy đủ các ký tự

Dấu ngoặc nhọn {}

Dấu ngoặc nhọn sử dụng theo công thức tổng quan: {n,m}, thay mặt đại diện cho chuyện ký tự đằng trước chúng rất có thể sinh ra tối thiểu n lần vào nhiều nhất m lần. nm là số nguyên dương và n <= m.

  • Nếu bỏ trống n, độ quý và hiếm này khuôn mẫu bằng 0.
  • Nếu bỏ trống m, độ quý và hiếm này khuôn mẫu là vô biên.
Biểu thức Chuỗi tỉ dụ Mô tả
a{2,3} abc dat  Không khớp vì không vừa lòng điều kiện kèm theo
abc daat  Khớp vì có sinh ra 2 ký tự a (daat)
aabc daaat  Khớp vì có sinh ra 2 và 3 ký tự a (aabcdaaat)
aabc daaaat  Khớp vì có sinh ra 2 và 3 ký tự a (aabcdaaaat)

Hãy thử một tỉ dụ nữa: RegEx [0-9] {2, 4} này khớp với chuỗi có tối thiểu 2 chữ số và nhiều nhất không hơn 4 chữ số.

Biểu thức Chuỗi tỉ dụ Mô tả
[0-9]{2,4} ab123csde  Khớp vì vừa lòng điều kiện kèm theo: ab123csde
12 and 345673  Khớp vì vừa lòng điều kiện kèm theo: 12345673
1 and 2  Không khớp vì chuỗi chỉ bắt buộc 1 chữ số

Dấu sổ dọc |

Biểu tượng dấu sổ dọc | này rất có thể khớp với chuỗi tồn ở một trong các 2 ký tự được định nghĩa trước và sau nó.

Biểu thức Chuỗi tỉ dụ Mô tả
a|b cde  Không khớp vì a, b đều không sinh ra
ade  Khớp vì vừa lòng điều kiện kèm theo, có a sinh ra: ade
acdbea  Khớp vì vừa lòng điều kiện kèm theo, ab đều sinh ra: acdbea

Ở đây, a|b khớp với bất kỳ chuỗi nào chứa a hoặc b.

Dấu ngoặc đơn ()

Dấu ngoặc đơn () được sử dụng để gom nhóm các pattern lại cùng nhau, chuỗi sẽ khớp với biểu thức chính quy phía bên trong dấu ngoặc này.

Ví dụ: (a|b|c)xz khớp với bất kỳ chuỗi nào có a hoặc b hoặc c đtạm ứng xz.

Biểu thức Chuỗi tỉ dụ Mô tả
(a|b|c)xz ab xz  Không khớp vì a hay b có đtạm ứng nhưng không liền với xz
abxz  Khớp vì vừa lòng điều kiện kèm theo, có b sinh ra sát trước xz: abxz
axz cabxz  Khớp vì vừa lòng điều kiện kèm theo, cả ab đều sinh ra sát trước xz: axz cabxz

Dấu gạch chéo ngược

Dấu gạch chéo ngược được sử dụng để thoát các ký tự nổi bật, nghĩa là lúc đtạm ứng một kí tự nổi bật, sẽ biến kí tự này thành một kí tự thường, bạn rất có thể tìm kiếm kí tự nổi bật này trong chuỗi như các kí tự thường khác.

Ví dụ: $a sẽ khớp với chuỗi chứa ký tự $ đtạm ứng a. Ở đây, với mô hình mẫu Dollar $ không tập luyện để khớp một chuỗi cuối cùng bằng ký tự đi kèm nó như trong máy móc RegEx, $ đơn thuần ký tự bình dân.

Tuy nhiên, một dấu gạch chéo ngược cũng biến thành biến một kí tự thường liền kế ẩn dưới thành một kí tự nổi bật.

Ví dụ, trường vừa lòng ký tự b không có dấu gạch chéo ngược sẽ khớp với các ký tự b in thường, nhưng khi nó có bổ sung thêm dấu gạch chéo ngược, b thì nó trở thành kí tự nổi bật, không muốn vừa lòng với bất kì ký tự nào nữa.

Một số pattern mang với

1. A – Khớp với các ký tự theo sau nó nằm tại đoạn đầu chuỗi.

Biểu thức Chuỗi tỉ dụ Mô tả
Athe the sun  Khớp vì the nằm tại đoạn đầu chuỗi
In the sun  Không khớp vì the không nằm tại đoạn đầu chuỗi

2. b – Khớp với các ký tự được bắt buộc kiến nghị nằm tại đoạn đầu hoặc cuối của từ.

Biểu thức Chuỗi tỉ dụ Mô tả
bfoo football  Khớp vì vừa lòng điều kiện kèm theo, foo nằm tại đoạn đầu chuỗi
a football  Khớp vì vừa lòng điều kiện kèm theo, foo nằm tại đoạn đầu từ thứ hai trong chuỗi
afootball  Không khớp vì foo nằm tại đoạn giữa từ trong chuỗi.
foob the foo  Khớp vì vừa lòng điều kiện kèm theo, foo nằm tại đoạn cuối chuỗi
the afoo test  Khớp vì vừa lòng điều kiện kèm theo, foo nằm tại đoạn cuối từ thứ hai trong chuỗi
the afootest  Không khớp vì foo nằm tại đoạn giữa từ trong chuỗi.

3. B – Trái ngược với b, khớp với các ký tự được bắt buộc kiến nghị không nằm tại đoạn đầu hoặc cuối của từ.

Biểu thức Chuỗi tỉ dụ Mô tả
bfoo football  Không khớp vì foo nằm tại đoạn đầu chuỗi
a football  Không khớp vì foo nằm tại đoạn đầu từ thứ hai trong chuỗi
afootball  Khớp vì foo nằm tại đoạn giữa từ trong chuỗi.
foob the foo  Không khớp vì foo nằm tại đoạn cuối chuỗi
the afoo test  Không khớp vì foo nằm tại đoạn cuối từ thứ hai trong chuỗi
the afootest Khớp vì foo nằm tại đoạn giữa từ trong chuỗi.

4. d – Khớp với các ký tự là chữ số, tương đồng với [0-9].

Biểu thức Chuỗi tỉ dụ Mô tả
d 12abc3  Khớp vì vừa lòng điều kiện kèm theo: 12abc3
Python  Không khớp vì không có số nguyên nào sinh ra

5. D – Khớp với các ký tự chưa hẳn số, tương đồng với [^0-9].

Biểu thức Chuỗi tỉ dụ Mô tả
D 1ab34"50  Khớp vì vừa lòng điều kiện kèm theo: 1ab34"50
1345  Không khớp vì chuỗi toàn số nguyên sinh ra

6. s – Khớp với bất kỳ ký tự khoảng trắng nào, tương đồng với [ tnrfv].

Biểu thức Chuỗi tỉ dụ Mô tả
s Python RegEx  Khớp vì chuỗi có khoảng chừng trắng
PythonRegEx  Không khớp vì chuỗi không có khoảng chừng trắng

7. S – Khớp với bất kỳ ký tự nào chưa hẳn khoảng trắng, tương đồng với [^ tnrfv].

Biểu thức Chuỗi tỉ dụ Mô tả
S a b  Khớp vì chuỗi có ký tự a b
       Không khớp vì chuỗi tất tật là khoảng trắng

8. w – Khớp với bất kỳ ký tự vần âm và chữ số nào, tương đồng với [a-zA-Z0-9_].

Chú ý: Dấu gạch dưới _ cũng khá được cho rằng một ký tự vần âm và chữ số.

Biểu thức Chuỗi tỉ dụ Mô tả
w 12&": ;c  Khớp vì chuỗi có ký tự chữ và số 12&": ;c
%"> !  Không khớp vì chuỗi không có ký tự chữ và số

9. W – Khớp với bất kỳ ký tự nào chưa hẳn là vần âm và chữ số, tương đồng với [^a-zA-Z0-9_].

Biểu thức Chuỗi tỉ dụ Mô tả
w 1a2%c  Khớp vì chuỗi có ký tự chưa hẳn chữ và số 1a2%c
Python  Không khớp vì chuỗi chỉ bắt buộc ký tự vần âm

Chú ý: Dấu gạch dưới _ cũng khá được cho rằng một ký tự vần âm và chữ số.

Tips: Để kiến thiết xây dựng các biểu thức chính quy RegEx, bạn rất có thể sử dụng máy móc chu chỉnh RegEx như regex101. Công cụ này chẳng những tạo các biểu thức chính quy mà còn phải là mộtm cho bạn hướng đến nó kỹ hơn.

Bây giờ thì bạn đã hiểu những điều chủ đạo về RegEx, hãy cùng đàm luận về kiểu cách ăn RegEx trong code Python.

Regular Expression trong Python

Regular Expression trong Python được nói lên qua module re, nên việc trước mắt khi anh chị em thích sử dụng regular expression thì sẽ càng phải import module re vào công tác làm công việc.

import re

Module này có ít nhiều các phương thức, hàm và hằng để tối ưu việc với RegEx. Kênh Tin TT39 sẽ liệt kê một vài thường được sử dụng kèm theo tỉ dụ để bạn dễ tưởng tượng và nắm bắt.

re.findall()

Phương thức re.findall() trả về một danh sách các chuỗi chứa tất tật thành tựu khớp với pattern đưa ra.

Cú pháp:

findall(partern, string)

Trong đó:

  • pattern là RegEx.
  • string là chuỗi bắt buộc so khớp.

Ví dụ: Trích xuất các số từ chuỗi cho sau trước: “hello 12 hi 89. Howdy 34”

import re    string = 'hello 12 hi 89. Howdy 34'  pattern = 'd+'    result = re.findall(pattern, string)   print(result)

Kết quả trả về:

['12', '89', '34']

re.split()

Phương thức re.split() dùng biểu thức chính quy để ngắt chuỗi thành các chuỗi con và trả về danh sách các chuỗi con này.

Cú pháp: 

re.split(pattern, string, maxsplit)

Trong đó: 

  • pattern là RegEx.
  • string là chuỗi bắt buộc so khớp.
  • maxsplit (số nguyên) là số chuỗi nhiều nhất sẽ có ngắt. Nếu để trống thì Python sẽ so khớp và cắt tất tật các chuỗi đạt điều kiện kèm theo.

Ví dụ: Ngắt tại đoạn có ký tự khoảng trắng:

import re    string = 'The rain in Vietnam.'  pattern = 's'    result = re.split(pattern, string)   print(result)  

Kết quả trả về:

['The', 'rain', 'in', 'Vietnam.']

Ví dụ: Ngắt chuỗi ở ký tự khoảng trắng trước mắt:

import re    string = 'The rain in Vietnam.'  pattern = 's'    result = re.split(pattern, string, 1)   print(result)  

Kết quả: 

['The', 'rain in Vietnam.']

Nếu không tìm kiếm thấy pattern, re.split() trả về danh sách chứa chuỗi rỗng.

re.sub()

Đây là 1 trong trong các số trong các phương thức trọng đại nhất sử dụng với Regular Expression 

Re.sub() sẽ hiện đại bằng tất tật thành tựu khớp với pattern trong chuỗi bằng một mô tả khác được truyền vào và trả về chuỗi đang được sửa đổi.

Cú pháp:

re.sub(pattern, replace, string, count)

Trong đó:

  • pattern là RegEx.
  • replace là mô tả hiện đại bằng cho chuỗi thành tựu khớp với pattern.
  • string là chuỗi bắt buộc so khớp.
  • count (số nguyên) là số lần hiện đại bằng. Nếu để trống thì Python sẽ coi độ quý và hiếm này bằng 0, so khớp và hiện đại bằng tất tật các chuỗi đạt điều kiện kèm theo.

Ví dụ: Code công tác làm công việc xóa tất tật các khoảng trắng

import re    # chuỗi nhiều dòng  string = 'abc 12  de 23 n f45 6'    # so khớp các ký tự khoảng trắng  pattern = 's+'    # chuỗi rỗng  replace = ''    new_string = re.sub(pattern, replace, string)   print(new_string)

Kết quả trả về: 

abc12de23f456

Nếu không tìm kiếm thấy thành tựu phù vừa lòng với pattern, re.sub() sẽ trả về chuỗi rỗng.

Ví dụ: Code công tác làm công việc xóa hai khoảng trắng trước mắt

import re    # chuỗi nhiều dòng  string = 'abc 12  de 23 n f45 6 n quantrimang trang web'    # so khớp các ký tự khoảng trắng  pattern = 's+'  replace = ''    new_string = re.sub(r's+', replace, string, 2)   print(new_string)  

Output trả về:

abc12de23    f45 6    quantrimang trang web

re.subn()

Phương thức re.subn() sử dụng na ná như re.sub() ở trên, nhưng thành tựu trả về cho dù có một trong các số tuple chứa hai độ quý và hiếm: chuỗi mới sau khi làm xong được hiện đại bằng và số lần hiện đại bằng đã triển khai.

import re    # chuỗi nhiều dòng  string = 'abc 12  de 23 n f45 6 n quantrimang trang web'    # so khớp các ký tự khoảng trắng  pattern = 's+'    # chuỗi rỗng  replace = ''    new_string = re.subn(pattern, replace, string)   print(new_string)  

Kết quả trả về:

('abc12de23f456quantrimangtrang web', 6)

re.search()

Phương thức re.search() sử dụng để tìm kiếm chuỗi phù vừa lòng với pattern RegEx. Nếu tìm kiếm thành công, re.search() trả về đối tượng người sử dụng khớp, còn nếu không, nó trả về None.

Cú pháp:

search(pattern, string)

Trong đó:

  • pattern là RegEx.
  • string là chuỗi bắt buộc so khớp.
import re    string = "Kênh Tin TT39 la trang web ban co the hoc Python"    # Kiem tra xem 'Quantrimang' co nam o dau chuoi khong  match = re.search('AQuantrimang', string)    if match: # nếu có tuổi sống chuỗi khớp    print("Tim thay 'Quantrimang' nam o dau chuoi") # in ra thong bao nay  else:    print("'Quantrimang' khong nam o dau chuoi") # khong thi in ra thong bao nay  

Kết quả trả về: 

Tim thay 'Quantrimang' nam o dau chuoi

Ở tỉ dụ này, match chứa đối tượng người sử dụng phù vừa lòng khớp với pattern.

Đối tượng match

Một số phương thức và tính chất thường được sử dụng với đối tượng người sử dụng match.

match.group()

Phương thức group() trả về các phần của chuỗi khớp với pattern.

import re    string = '39801 356, 2102 1111'    pattern = '(d{3}) (d{2})'    match = re.search(pattern, string)    if match: #nếu có tuổi sống chuỗi khớp    print(match.group()) # in ra thành tựu  else:    print("Không khớp") # Không thì hiện báo động    # Output: 801 35

Ở đây, biến match chứa đối tượng người sử dụng match.

Ta có pattern là (d{3}) (d{2}) chia làm hai nhóm nhỏ (d{3})(d{2}). Bạn rất có thể nhận được một phần của chuỗi tương ứng với các nhóm con trong ngoặc đơn này như sau:

>>> match.group(1)  '801'    >>> match.group(2)  '35'    >>> match.group(1, 2)  ('801', '35')    >>> match.groups()  ('801', '35')

match.start(), match.end() và match.span()

Hàm start() trả về chỉ mục bắt đầu của chuỗi con phù vừa lòng. Tương tự, end() trả về chỉ mục cuối cùng của chuỗi con phù vừa lòng.

>>> match.start()  2  >>> match.end()  8

Hàm span() trả về tuple chứa chỉ mục bắt đầu và cuối cùng của phần chuỗi phù vừa lòng.

>>> match.span()  (2, 8)

match.re và match.string

Thuộc tính re của đối tượng người sử dụng match sẽ trả về một biểu thức chính quy. Tương tự, tính chất string trả về chuỗi đang được truyền trong đoạn code.

>>> match.re  re.compile('(\d{3}) (\d{2})')  >>> match.string  '39801 356, 2102 1111'

Trên đây là tất tật các phương thức thường được sử dụng nhất trong module re.

Sử dụng tiền tố r trước RegEx

Khi tiền tố r hoặc R được sử dụng trước một biểu thức chính quy thay mặt đại diện cho chuyện chuỗi tiếp sau nó đơn thuần những ký tự bình dân.

Ví dụ: 'n' là 1 trong trong các số dòng mới newline, còn r'n' có nghĩa là chuỗi cho dù có hai ký tự: dấu gạch chéo ngược n.

Dấu gạch chéo ngược được sử dụng để thoát các ký tự như đã nhắc tới ở bên trên. Tuy nhiên, sử dụng tiền tố r trước thì nó đơn thuần một ký tự bình dân.

import re    string = 'n and r are escape sequences.'    result = re.findall(r'[nr]', string)   print(result)    # Output: ['n', 'r']

Bài trước: Khai báo @property trong Python

Sưu Tầm: Internet – Kênh Tin: TT39