Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Regular Expression (Biểu thức chính quy) trong Python với ví dụ


Regular expressions (biểu thức chính quy) là một loại ngôn ngữ lập trình dùng để xác định xem một mẫu (pattern) có tồn tại trong một chuỗi ký tự (string) cho trước hay không.

Regular expression hoặc Regex là một chuỗi ký tự được dùng để kiểm tra xem một chuỗi có chứa mẫu tìm kiếm cụ thể hay không.

Module RegEx

Để dùng module RegEx, Python đi kèm gói tích hợp tên là re, chúng ta cần import để làm việc với Regular expression.

import re

Ví dụ

import re
txt = "Use of python in Machine Learning"
x = re.search("^Use.*Learning$", txt)
if (x):
    print("YES! We have a match!")
else:
    print("No match")

Kết quả

YES! We have a match!

Các hàm RegEx

Module re cung cấp một vài hàm cho phép tìm kiếm chuỗi cho một kết quả khớp.

Hàm Mô tả
findall Trả về danh sách chứa tất cả các kết quả khớp
search Trả về đối tượng Match, nếu tìm thấy khớp ở bất kỳ đâu trong chuỗi
split Trả về danh sách, nơi chuỗi được tách tại mỗi khớp
sub Thay thế một hoặc nhiều khớp bằng một chuỗi

Metacharacters (Ký tự đặc biệt)

Metacharacters trong RegEx là các ký tự có ý nghĩa đặc biệt.

Ký tự Mô tả Ví dụ
[] Một tập hợp ký tự "[a-m]"
\ Báo hiệu chuỗi đặc biệt, cũng dùng để escape ký tự đặc biệt "\d"
. Bất kỳ ký tự nào trừ ký tự newline "he..o"
^ Bắt đầu bằng "^Hello"
$ Kết thúc bằng "World$"
* Không hoặc nhiều lần xuất hiện "aix*"
+ Một hoặc nhiều lần xuất hiện "aix+"
{} Chính xác số lần xuất hiện xác định "a|{2}"
| Hoặc (Either or) "short|long"
() Capture và group (nhóm)  

Special Sequences (Chuỗi đặc biệt)

Special sequences trong RegEx là một \ theo sau bởi một trong các ký tự liệt kê dưới và có ý nghĩa đặc biệt:

Ký tự Mô tả Ví dụ
\A Trả về khớp nếu ký tự xác định ở đầu chuỗi "\APyt"
\b Trả về khớp nếu ký tự xác định ở đầu hoặc cuối từ r"\bPython" r"world\b"
\B Trả về khớp nếu ký tự xuất hiện, nhưng KHÔNG ở đầu (hoặc cuối) từ r"\BPython" r"World\B"
\d Trả về khớp nếu chuỗi chứa chữ số "\d"
\D Trả về khớp nếu chuỗi KHÔNG chứa chữ số "\D"
\s Trả về khớp nơi chuỗi chứa ký tự khoảng trắng "\s"
\S Trả về khớp nơi chuỗi KHÔNG chứa ký tự khoảng trắng "\S"
\w Trả về khớp nếu chuỗi chứa ký tự từ (chữ cái a-z, chữ số 0-9, gạch dưới _) "\w"
\W Trả về khớp nơi chuỗi KHÔNG chứa ký tự từ "\W"
\Z Trả về khớp nếu ký tự xác định ở cuối chuỗi "world\Z"

Sets (Tập hợp)

Một set trong RegEx là tập hợp ký tự bên trong cặp ngoặc vuông [] có ý nghĩa đặc biệt.

Set Mô tả
[raj] Trả về khớp nếu một trong các ký tự chỉ định (a, r hoặc n) xuất hiện
[a-r] Trả về khớp cho bất kỳ chữ cái thường nào, theo bảng chữ cái giữa a và r
[^raj] Trả về khớp cho bất kỳ ký tự nào TRỪ r, a và j
[0123] Trả về khớp nơi bất kỳ trong các ký tự...
[0-9] Trả về khớp cho bất kỳ chữ số nào giữa 0 và 9
[0-3][0-8] Trả về khớp cho bất kỳ số hai chữ số nào giữa 00 và 38
[a-zA-Z] Trả về khớp cho bất kỳ ký tự nào theo bảng chữ cái a-z hoặc A-Z
[+] Trả về khớp cho bất kỳ ký tự + nào trong chuỗi

Ví dụ - findall()

Hàm findall() trả về danh sách chứa tất cả các kết quả khớp.

# In danh sách tất cả các khớp ("in") từ văn bản
import re
txt = "Use of python in Machine Learning"
x = re.findall("in", txt)
print(x)

Kết quả

['in', 'in', 'in']

Kết quả trên hiển thị danh sách chứa tất cả các khớp theo thứ tự chúng được tìm thấy. Tuy nhiên, nếu không tìm thấy khớp, danh sách rỗng được hiển thị.

Chỉ cần thay đổi dòng dưới trong chương trình trên, "pattern" không có trong văn bản hoặc chuỗi.

x = re.findall("Hello", txt)

Kết quả

[]

Ví dụ - hàm search()

Hàm search() tìm kiếm chuỗi và trả về đối tượng match nếu tìm thấy khớp.

Tuy nhiên, nếu có nhiều hơn một khớp, chỉ lần xuất hiện đầu tiên của khớp sẽ được trả về.

import re
txt = "Python is one of the most popular languages around the world"
searchObj = re.search("\s", txt)
print("Ký tự khoảng trắng đầu tiên nằm ở vị trí: ", searchObj.start())

Kết quả

Ký tự khoảng trắng đầu tiên nằm ở vị trí: 6

Tuy nhiên, nếu không tìm thấy khớp thì None được trả về.

Ví dụ - hàm split()

Hàm split() trong RegEx trả về danh sách nơi chuỗi đã được tách tại mỗi khớp:

# Tách tại mỗi ký tự khoảng trắng
import re
string = "Python is one of the most popular languages around the world"
searchObj = re.split("\s", string)
print(searchObj)

Kết quả

['Python', 'is', 'one', 'of', 'the', 'most', 'popular', 'languages', 'around', 'the', 'world']

Ví dụ - hàm sub()

Hàm sub() trong RegEx dùng để thay thế khớp bằng văn bản bạn chọn.

# Thay thế mỗi khoảng trắng trong chuỗi bằng _:
import re
string = "Python is one of the most popular language around the world"
searchObj = re.sub("\s", "_", string)
print(searchObj)

Kết quả

Python_is_one_of_the_most_popular_language_around_the_world

Match Object (Đối tượng Match)

Một match object trong RegEx là đối tượng chứa thông tin về tìm kiếm và kết quả. Nếu không tìm thấy khớp, None được trả về.

Ví dụ - Tìm kiếm chuỗi và trả về match object.

import re
string = "Python is one of the most popular language around the world"
searchObj = re.search("on", string)
print(searchObj)

Kết quả

<_sre.SRE_Match object; span=(4, 6), match='on'>

Match object có các thuộc tính và phương thức dùng để truy xuất thông tin về tìm kiếm và Kết quả.

  • .span() – trả về tuple chứa vị trí bắt đầu và kết thúc của khớp tìm thấy.
  • .string – trả về chuỗi được truyền vào hàm.
  • .group() – trả về phần của chuỗi nơi có khớp.

Ví dụ - In phần của chuỗi nơi có khớp.

# Tìm từ nào bắt đầu bằng chữ hoa "P":
import re
string = "Python is one of the most popular language around the world"
searchObj = re.search(r"\bP\w+", string)
print(searchObj)

Kết quả

<_sre.SRE_Match object; span=(0, 6), match='Python'>