ỨNG DỤNG REGEX ĐỂ TRÍCH XUẤT THÔNG TIN KHÁCH HÀNG, EMAIL TỪ TIN NHẮN VĂN BẢN

CÁC NỘI DUNG CHÍNH
I. YÊU CẦU ĐẦU VÀO
1. CHUẨN BỊ NỘI DUNG
2. YÊU CẦU KIẾN THỨC
3. ĐỀ BÀI VÀ YÊU CẦU ĐẶT RA
II. CÁC BƯỚC THỰC HIỆN
III. KẾT LUẬN
1. Trường hợp vận dụng 
2. Ưu điểm
3. Nhược điểm

I. YÊU CẦU ĐẦU VÀO

1. CHUẨN BỊ NỘI DUNG

Để bắt đầu bài học, các bạn cần có ít nhất 01 máy tính để bàn hoặc laptop, trong đó đã cài đặt:

a. Python

b. Visual Studio Code

c. Microsoft Excel từ 2007 trở lên để tối ưu việc lập trình bằng python.

d. Teamviewer hoặc Ultraviewer để được các giảng viên và trợ giảng của trang web Pyan.vn hỗ trợ 24/7 nếu các bạn bị vướng mắc trong quá trình code.

2. YÊU CẦU KIẾN THỨC

Đối với bài học này, các bạn cần nẵm vững các kiến thức sau:

a. Cách sử dụng hàm PRINT

b. Cách gán giá trị cho cell trong excel.

c. Nếu chưa nắm vững kiến thức, các bạn có thể trao đổi thêm với các giảng viên và trợ giảng của trang web Pyan.vn để được hỗ trợ.

3. ĐỀ BÀI VÀ YÊU CẦU ĐẶT RA

a. Đề bài:

Có 1 bảng dữ liệu với vùng excel thể hiện thông tin 2 tin nhắn văn bản, trong các tin nhắn có chứa tên khách hàng, số điện thoại và email (như hình ở dưới)

b. Yêu cầu đặt ra:

Sử dụng lập trình Python để thực hiện trích xuất:

Trường hợp 1: Tên khách hàng trong tin nhắn văn bản thứ nhất.

Trường hợp 2: Email khách hàng trong tin nhắn văn bản thứ hai.

Bảng dữ liệu ban đầu:

Bảng dữ liệu thu được sau khi code:      

II. CÁC BƯỚC THỰC HIỆN

II.a. Trích xuất tên khách hàng trong tin nhắn văn bản thứ nhất

Để sử dụng được Regex trong python, chúng ta cần import module re như sau:

import re

Ở đây chúng ta nhìn thấy chuỗi ký tự cần tìm đang có quy luật như sau: 

Chuỗi tên đều nối đến từ phone

Trong Regex để tìm ra kí tự 1 chữ cái ta sử dụng phương thức \w. Để lấy được 1 từ (phân biệt nhau bởi dấu cách, dấu tab…ta sử dụng \w+. Tuy nhiên nếu sử dụng \w+ thì ta chỉ lấy được tên có 1 từ ví dụ như Andrey, Queen, King, Prince, còn các tên khác thì chúng ta sẽ không lấy được toàn bộ. Vậy để lấy được toàn bộ tên chúng ta sẽ phải thêm 1 kí tự đặc biệt đó là .* (dot-star) và kết thúc bằng chuỗi phone. Ta sẽ làm một regex có format như sau

regex1 = re.compile(r’(\w+.*) phone’)   

Chú ý ta sẽ đóng ngoặc (\w+.*) để chúng ta tạo ra 1 nhóm xuất ra đúng tên thôi, nếu không có đóng ngoặc này thì chuỗi sẽ lấy ra cả chữ phone nữa

Sử dụng format tạo được để tìm kiếm trong chuỗi msg bằng hàm search như sau:

mo1 = regex1.findall(msg1)

In kết quả ra màn hình:

print(mo1)

Kết quả trả ra: [‘Andrey’, ‘Bùi Thanh Sơn’, ‘Nguyễn Thị Phương Thảo’, ‘Queen’, ‘King’, ‘Prince’] đúng như chúng ta mong muốn

II.b. Trích xuất email khách hàng trong tin nhắn văn bản thứ hai.

Chúng ta để ý các dạng cấu trúc của các email rất khác nhau. Vậy ta sử dụng regex trong trường hợp này như thế nào

Với cấu trúc 1 email: ta có thể phân chia làm 3 phần

– username: như an.drey0918, sonbt-26092002..

– dấu @

– domain name: như gmail.com, hotmail.com…

Ta sẽ phân tích từng mục như sau

– Đối với username: ta có thể thấy trong 1 user name có thể chứa chữ thường, chữ hoa, số và một số ký tự đặc biệt như –(gạch ngang),%, +, .(chấm), _(gạch dưới)

Như vậy để có thể tìm được tất cả các ký tự trên trong 1 user name ta sẽ sử dụng cấu trúc

[a-zA-Z0-9._%+-]+       # username

Dấu [] sẽ giúp chúng ta liệt kê tất cả các ký tự mà có thể xuất hiện trong chuỗi

a-z: mang ý nghĩa sẽ match với tất cả các ký tự từ a đến z (chữ thường); dấu – mang ý nghĩa là liệt kê tuần tự

A-Z tương tự như a-z nhưng áp dụng cho chữ Hoa

0-9 sẽ match cho tất cả các số từ 0 tới 9

Và ở trong câu lệnh có thêm các kí tự đặc biệt -,%,+,_, .

Dấu + ngoài cùng [] với ý nghĩa sẽ match cho nhiều kí tự chứ không phải 1 kí tự

– Tiếp theo đối với dấu @ ta chỉ cần viết @ thôi

– Đối với domain name: ta có thể thấy trong 1 domain name có thể chứa chữ thường, chữ hoa, số và một số ký tự đặc biệt như –(gạch ngang), .(chấm)

Vậy ta cũng làm tương tự như đối với user name lập một regex với format như sau

[a-zA-Z0-9.-]+          # domain 

Kết hợp lại toàn bộ cấu trúc regex ta sẽ được :

Chú ý: Để viết tường minh, như part 1 đã có nêu chúng ta có thể viết với cấu trúc

re.complie(r’’’(cấu trúc regex)’’’,re.VERBOSE)

Tìm kiếm format này trong chuỗi msg2:

mo2 = regex2.findall(msg2)

In kết quả 

print(mo2)

Kết quả cho ra: [‘an.drey0918@gmail.com’, ‘sonbt-26092002@hotmail.com’, ‘thaophuong_NguyEn%145+Thi@yahoo.com’, ‘quEen.beauti-fuL@prince.us.com’, ‘kIng1990@hut-wiki.pedia.com’]

Như vậy với 2 phần part 1 và part 2 của bài Regex chúng ta đã có một số phương thức cơ bản để có thể đưa ra một phương pháp tìm chuỗi nhanh, đơn giản và ngắn gọn hơn nhiều so với việc sử dụng vòng lặp.

Kiến thức về Regex sẽ được áp dụng nhiều trong các bài toán về text file sau này

III. KẾT LUẬN

1. Trường hợp vận dụng

Được sử dụng để tạo ra những phương thức tìm kiếm cho 1 String theo quy luật nhất định giúp chúng ta tìm kiếm trong văn bản một cách đơn giản và hiệu quả hơn.

2. Ưu điểm

Việc cho việc truy xuất dữ liệu được đơn giản hơn rất nhiều so với việc dùng vòng lặp for.

3. Nhược điểm

Yêu cầu sự tỉ mỉ trong việc xây dựng công thức, dễ bị nhầm lẫn.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *