ỨNG DỤNG REGEX ĐỂ TRÍCH XUẤT NHIỀU SỐ ĐIỆN THOẠI 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 3 tin nhắn văn bản, trong các tin nhắn có chứa số điện thoại (nội dung như trong 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 nhiều số điện thoại trong tin nhắn văn bản thứ ba.

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

Ở đây bài toán này đã trở nên phức tạp hơn rất nhiều, có thể thấy nếu giải quyết với các cách bình thường như vòng lặp for ta phải thực hiện rất vất vả khi các định dạng chuỗi số điện thoại đều khác nhau.

Ta sẽ xử lý bằng Regex như sau:

Tạo một format tìm kiếm

Ở đây hàm regex có một số điểm mới như sau

– Để có thể viết 1 cách tường mình chúng ta không nên viết thành một chuỗi như các bài toán phía trên mà nên viết thành mục. Để viết được như vậy ta cần phải sử dụng cấu trúc

re.compile(r’’’( nội dung )‘’’, re.VERBOSE)

Trong đó mục nội dung chúng ta có thể xuống dòng, viết comment

Ta sẽ giải nghĩa từng mục như sau

– Với mục Area Code của chuỗi số điện thoại ta thấy có 3 dạng chính:

+ 1 là có dấu ngoặc (): ở đây là (+84)

+ 2 là không có dấu ngoặc: +84

+ 3 là không có Area Code: Nghĩa là Area Code có thể có hoặc không

Với dấu +, đây là một ký tự đặc biệt (hãy nhớ đến câu lệnh \d+ ở các bài toán trước), vì vậy muốn sử dụng nó như 1 string ta phải đặt dấu \ trước nó.

Dấu ( và ) cũng đều là ký tự đặc biệt, vậy ta cũng phải biến nó thành 1 string với cách sử dụng dấu \ trước nó

Để sử dụng 1 trong 2 sự lựa chọn, ở đây là loại có dấu ngoặc và không có dấu ngoặc ta sẽ sử dụng kí tự |

Với ký tự số ta sử dụng \d+

Are Code có thể có hoặc không, vậy ta sẽ phải sử dụng kí tự ()?

Kết hợp lại các phân tích ta sẽ có format cho Area Code như sau:

 (\+\d+|\(\+\d+\))?

– Với mục ngăn cách Area Code với số đầu tiên ta thấy có 4 dạng

+ 1 là dấu –

+ 2 là dấu .

+ 3 là dấu cách

+ 4 là không có dấu gì cả: nghĩa là có thể có hoặc không kí tự phân cách

Đối với các kí tự đặc biệt như dấu – và . thì ta sẽ thêm dấu \ phía trước

Dấu cách ta sẽ sử dụng \s

Kêt hợp lại ta có format cho dấu phân cách như sau:

(\-|\.|\s)?

Với các nhóm số ta chỉ cần đơn giản đặt format:

(\d+)

Tìm kiếm format này trong chuỗi cần tìm:

match3_number1 = number3_regex1.findall(msg3)

In kết quả của biến match3_number1

print(match3_number1)

Kết quả:

[(‘+84-912-464-366’, ‘+84’, ‘-‘, ‘912’, ‘-‘, ‘464’, ‘-‘, ‘366’), (‘(+84)-888-031-288’, ‘(+84)’, ‘-‘, ‘888’, ‘-‘, ‘031’, ‘-‘, ‘288’), (‘ 094-516-4490’, ”, ‘ ‘, ‘094’, ‘-‘, ‘516’, ‘-‘, ‘4490’), (‘ 091.246.8080’, ”, ‘ ‘, ‘091’, ‘.’, ‘246’, ‘.’, ‘8080’), (‘ 094 516 4422’, ”, ‘ ‘, ‘094’, ‘ ‘, ‘516’, ‘ ‘, ‘4422’), (‘ 0965161122’, ”, ‘ ‘, ‘09651611’, ”,

‘2’, ”, ‘2’)]

Chúng ta có thể nhận thấy kết quả trả về 1 list các tuple trong đó phần từ đầu tiên sẽ là số điện thoại cần tìm. Vậy chúng ta sẽ lập 1 list để lấy toàn bộ số điện thoại này như sau:

phone_no = [match3_number1[phone][0] for phone in range(len(match3_number1))]

Chúng ta in giá trị của phone_no

print(phone_no)

Kết quả:

[‘+84-912-464-366’, ‘(+84)-888-031-288’, ‘ 094-516-4490’, ‘ 091.246.8080’, ‘ 094 516 4422’, ‘ 0965161122’]

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 *