/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Học Python Qua Ví Dụ #018 - Regular Expression Trong Python

1. Regular Expression (RegEx) Funtions:
  • 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

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

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} 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!


No comments:

Post a Comment

/*header slide*/