1. Regular Expression (RegEx) Funtions:
2. Cú pháp pattern sử dụng RegEx trong Python:
- Match: Trả về kết quả THÀNH CÔNG hoặc None với mẫu trong chuỗi có cờ tùy chọn
- Search: Trả về kết quả THÀNH CÔNG nếu tìm thấy hoặc None nếu không tìm thấy
- Findall: Trả về danh sách chứa TẤT CẢ các kết quả tìm được
- Sub: Tìm và thay thế một hoặc nhiều chuỗi nếu tìm thấy
- Split: Trả về danh sách chứa các chuỗi con
Ký Hiệu | Mô Tả | Biểu Thức | Giải Thích | Kết Quả |
---|---|---|---|---|
. | Bất kỳ ký tự nào | |||
+ | MỘT hoặc NHIỀU lần xuất hiện TRƯỚC nó | x = re.findall("aix+", txt) | Tìm kiếm chuỗi "aix" hoặc "aixxx" có trong chuỗi txt không | |
* | không hoặc NHIỀU lần xuất hiện TRƯỚC nó | x = re.findall("aix*", txt) | Tìm kiếm chuỗi "ai" hoặc "aix" hoặc "aixxx" có trong chuỗi txt không | |
? | không hoặc MỘT lần xuất hiện TRƯỚC nó | x = re.findall("aix?", txt) | Tìm kiếm chuỗi "ai" hoặc "aix" có trong chuỗi txt không | |
^ | đại diện cho mẫu ĐỨNG ĐẦU một chuỗi | x = re.findall("^aix", txt) | Tìm kiếm chuỗi "aix" nếu mẫu đứng ở ĐẦU trong chuỗi txt | |
$ | đại diện cho mẫu KẾT THÚC một chuỗi | x = re.findall("aix$", txt) | Tìm kiếm chuỗi "aix" nếu mẫu đứng ở CUỐI trong chuỗi txt | |
\d | ký tự là số, tương đương từ 0->9 | x = re.findall("\d", txt) | Tìm một ký tự số (từ 0 đến 9) trong chuỗi txt | |
\D | Chuỗi không chứa ký tự là số (ngược với \d), giống với [^0-9] | |||
\s | ký tự là khoảng trắng, tương đương [\t\n\r\f\v] | x = re.findall("\s", txt) | Trả về chuỗi CÓ chứa bất kỳ khoảng trắng nào | |
\S | Ngược với \s, chuỗi KHÔNG CHỨA khoảng trắng, giống với [^\t\n\r\f\v] | x = re.findall("\S", txt) | Trả về chuỗi KHÔNG chứa bất kỳ khoảng trắng nào | |
[] | Tập hợp các ký tự muốn khớp | x = re.findall("[a-c]", txt) | tìm các ký tự: "a" hoặc "b" hoặc "c" trong chuỗi txt | |
[^] | Tập hợp các ký tự KHÔNG khớp | x = re.findall("[^a-c]", txt) | tìm các ký tự NGOẠI TRỪ: "a" hoặc "b" hoặc "c" trong chuỗi txt | |
{n} | Tìm chính xác ký tự và n lần xuất hiện của ký tự | x = re.findall("a{3}", txt) | tìm ký tự "a" nếu nó xuất hiện 3 lần | |
{n,m} | Khớp với ký tự xuất hiện 'n' lần nhưng không quá 'm' | x = re.findall("al{2,3}", txt) | tìm ký tự "a" và 2 ký tự "l" hoặc 3 ký tự "l" trong chuỗi txt | |
{n,} | Chỉ khớp với ký tự khi nó xuất hiện 'n' lần trở lên | re.findall("a{5,}", txt) | Tìm và trả về kết quả nếu ký tự "a" xuất hiện ít nhất 5 lần | |
() | Gom nhóm các mẫu lại với nhau | |||
| | Hoặc | x= re.findall("(a|b|c)xz", txt) | tìm kiếm trước xz là ký tự: "a" hoặc "b" hoặc "c" | |
\w | Chuỗi chứa bất kỳ ký tự nào trong nhóm từ a tới Z, từ 0 tới 9 và dấu _ (underscore), giống với [a-zA-Z0-9_] | |||
\W | Ngược lại \w | |||
?: | Tìm không nhớ | \d{1,3}(?:\.\d{1,3}){3} | Tìm ký tự đầu tiên là số xuất hiện 1 đến 3 lần, tiếp đến ký tự "." và sau đó là ký tự số và chúng ( dấu chấm và số) phải xuất hiện đúng 3 lần | Trả về chuỗi dạng IPv4 |
\+ | là dấu cộng | |||
\( | là dấu mở ngoặc | |||
\) | là dấu đóng ngoặc | |||
()? | Có hoặc không có nhóm ký tự (nhóm ký tự đặt trong dấu ngoặc đơn) |
- Ví dụ re.match:
import re # import module re vào chương trình
'''
định nghĩa chuỗi mẫu có:
- chiều dài là: 5
- ký tự ĐẦU tiên là: a
- 3 ký tự GIỮA là: các ký tự bất kỳ
- ký tự CUỐI cùng là: z
'''
pattern = '^a...z$'
test_in = input("Nhap vao chuoi: ")
result = re.match(pattern, test_in)
if result:
print("Da TIM THAY chuoi.")
print(result)
else:
print("Chuoi nhap vao KHONG CO trong chuoi.")
Nếu chuỗi nhập vào thỏa mãn 4 điều kiện:
- Chiều dài: 5
- Ký tự ĐẦU: a
- 3 ký tự GIỮA: 3 ký tự bất kỳ
- Ký tự CUỐI:z
thì sẽ cho kết quả TÌM THẤY, ngược lại sẽ không tìm thấy.
- Ví dụ re.search:
import re
'''
Tìm trong chuỗi txt nếu:
- ĐẦU là chữ: "The"
- GIỮA là CÓ hoặc KHÔNG CÓ bất kỳ ký tự nào
- CUỐI là chữ: "Spain"
'''
txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)
if x:
print("Da TIM THAY chuoi!")
print(x)
# chỉ in ra nội dung của chuỗi nếu tìm thấy dùng
print(x.group(0))
else:
print("KHONG tim thay!")
print(x)
- Ví dụ re.findall:
import re
'''
Tìm "ai" trong chuỗi txt, tất cả các lần tìm thấy sẽ lưu vào biến x
Trong trường hợp này kết sẽ là: ['ai', 'ai']
'''
txt = "The rain in pain"
x = re.findall("ai", txt)
if x:
print("Da TIM THAY chuoi!")
print(x)
else:
print("KHONG tim thay!")
print(x)
- Ví dụ re.sub:
import re
'''
Tìm khoảng trắng trong chuỗi txt nếu:
- Tìm thấy thì thay thế khoảng trắng bằng số 9
- và chỉ thay thế HAI(2) LẦN
=> KẾT QUẢ: "The9rain9in pain".
Trong chuỗi hiện tại có 3 dấu khoảng trắng nhưng CHỈ THAY 2 khoảng trắng đầu tiên tìm được
'''
txt = "The rain in pain"
x = re.sub("\s", "9", txt, 2)
if x:
print("Chuoi da THAY THE!")
print(x)
else:
print("KHONG tim thay!")
print(x)
- Ví dụ re.split:
import re
'''
Tìm khoảng trắng trong chuỗi txt nếu:
- Tìm thấy thì TÁCH chuỗi
- và chỉ tách HAI(2) LẦN
=> KẾT QUẢ: ['The', 'rain', 'in pain'].
Trong chuỗi hiện tại có 3 dấu khoảng trắng nhưng TÁCH 2 khoảng trắng đầu tiên tìm được
'''
txt = "The rain in pain"
x = re.split("\s", txt, 2)
if x:
print("Chuoi da TACH!")
print(x)
else:
print("KHONG tim thay!")
print(x)
- Ví dụ khác:
RegEx | Mô Tả |
---|---|
\w{4}\.\w{4}\.\w{4} | Có dạng 12 ký tự, được chia thành 3 cụm |
Mỗi cụm này cách nhau bằng dấu chấm ".", mỗi cụm được phép lấy chính xác 4 ký tự | |
Các ký tự trong mỗi cụm có thể là: chữ, số, hoặc chữ số đó là ký tự gạch chân | |
[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4} | Có dạng 12 ký tự, được chia thành 3 cụm (Định dạng MAC address trong cisco) |
Mỗi cụm này cách nhau bằng dấu chấm ".", mỗi cụm được phép lấy chính xác 4 ký tự | |
Các ký tự trong mỗi cụm chỉ được phép lấy là: | |
- Các ký tự từ: a - f | |
- Các ký tự GHI HOA từ: A - F | |
- Các số tự nhiên từ: 0 - 9 | |
[a-fA-F0-9]{4}(?:\.[a-fA-F0-9]{4}){2} | Kết quả cuối cùng vẫn trả về định dạng MAC Address trong Cisco IOS |
Cụm đầu tiên sẽ lấy là [a-fA-F0-9]{4} | |
Cụm thứ 2 gồm 2 cụm nhỏ tương tự như cụm đầu nhưng: | |
- Trước đó phải là ký tự dấu chấm "." | |
- Khi tìm thấy dấu chấm không được ghi nhớ nó (dấu chấm) | |
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} | Có dạng số, được chia thành 4 cụm, mỗi cụm này cách nhau bằng dấu chấm "." |
Các số được phép lặp lại từ 1 đến 3 lần | |
\d{1,3}(?:\.\d{1,3}){3} | Tương tự chúng ta có cách viết rút gọn để lấy chuỗi có dạng địa chỉ IPv4 |
Xong!