^\$?\-?[[1-9]{1}[0-9]{0,2}[\,\d{3}]*[\. \d{0,2}]?. [1-9]{1}\d{0,}[\. \d{0,2}]?. 0[\. \d{0,2}]?. [\. \d{1,2}]]$. ^\-?\$?[[1-9]{1}\d{0,2}[\,\d{3}]*[\. \d{0,2}]?. [1-9]{1}\d{0,}[\. \d{0,2}]?. 0[\. \d{0,2}]?. [\. \d{1,2}]]$. ^\[\$?[[1-9]{1}\d{0,2}[\,\d{3}]*[\. \d{0,2}]?. [1-9]{1}\d{0,}[\. \d{0,2}]?. 0[\. \d{0,2}]?. [\. \d{1,2}]]\]$
Bài viết này trình bày mọi thứ bạn cần biết về phân tích giá trong Python. Đến cuối bài viết này, bạn sẽ có thể trích xuất giá và đơn vị tiền tệ từ văn bản thô, thường được thu thập từ các nguồn dữ liệu bên ngoài như trang web hoặc tệp
Mục lục
Giới thiệu
Bài viết này đề cập đến một trường hợp cụ thể - chuyển đổi văn bản chưa được xử lý có chứa giá và bất kỳ dữ liệu nào khác giống như tiền thành giá và đơn vị tiền tệ. Đây là một vấn đề phổ biến cần được giải quyết trong các trường hợp quét web, làm sạch dữ liệu và các dự án tương tự mà tiền tệ cần được làm sạch
Dữ liệu tiền tệ có thể ở nhiều định dạng khác nhau, khác nhau, đặc biệt với mã tiền tệ trong ngôn ngữ. Dưới đây là một vài ví dụ
'29,99 €' # Comma as decimal separator '59,90 EUR' '$ 9.99' # Period as decimal separator '9.99 USD' 'Price: $12.99' '¥ 170 000' '12,000원' '₹898.00' 'Price From £ 39.95'
Vì rõ ràng là mọi định dạng đều cần một cách khác nhau để trích xuất tiền tệ và giá trị giá
Bài viết này trước tiên sẽ xem xét cách thực hiện nó bằng Thư viện chuẩn Python. Trong phần thứ hai, một thư viện chuyên dụng cho mục đích này có tên là Price Parser sẽ được xem xét
Phân tích giá bằng thư viện chuẩn Python
Cách tốt nhất để trích xuất dữ liệu số từ bất kỳ chuỗi nào là sử dụng biểu thức chính quy. Các thao tác biểu thức chính quy có thể được thực hiện bằng cách sử dụng mô-đun
expression = '[\d\s.,]*'8 của Python
Đây sẽ là một quá trình gồm hai phần. Phần đầu tiên là xây dựng biểu thức chính quy và phần thứ hai là sử dụng biểu thức này
Xây dựng biểu thức chính quy
Biểu thức chính quy có thể khó khăn cho người mới bắt đầu. Các trang web như Regexr có thể giúp xây dựng và kiểm tra các biểu thức chính quy
Hãy bắt đầu với một ví dụ
- Các chữ số có thể khớp với biểu thức chính quy
expression = '[\d\s.,]*'
9 - Giá cũng có thể có dấu phẩy và dấu chấm. Chúng có thể được chọn bằng cách sử dụng
expression = '[\d\s.,]*\d'
0 vàexpression = '[\d\s.,]*\d'
1 - Giá cũng có thể chứa không gian. Các ký tự khoảng trắng có thể được chọn bằng cách sử dụng
expression = '[\d\s.,]*\d'
2 - Tất cả những điều trên cần được đặt trong một bộ bằng cách sử dụng
expression = '[\d\s.,]*\d'
3 - Có thể có 0 hoặc nhiều trường hợp ở trên. Chúng ta cần sử dụng thẻ đại diện
expression = '[\d\s.,]*\d'
4 cho việc này - Nếu chúng ta kết hợp tất cả những thứ này trong một tập hợp, biểu thức chính quy thu được sẽ như thế này
expression = '[\d\s.,]*'
Biểu thức này cũng sẽ khớp với khoảng trống bên ngoài đơn vị tiền tệ. Điều này có thể được khắc phục dễ dàng bằng cách nối thêm
expression = '[\d\s.,]*'9 để đảm bảo rằng ngay cả khi không gian được khớp, nó sẽ kết thúc bằng một số
expression = '[\d\s.,]*\d'
Trong câu lệnh này, tất cả các ký tự từ tập hợp có trong dấu ngoặc vuông sẽ được khớp và dấu hoa thị sẽ đảm bảo rằng 0 hoặc nhiều ký tự trong số này có thể được khớp
Nếu bạn đang xây dựng biểu thức chính quy này tại Regexr, bạn có thể dán vào tất cả các chuỗi và xem chuỗi nào khớp
Bây giờ chúng ta có thể kết hợp mã Python cần thiết để trích xuất giá
expression = '[\d\s.,]*'1
Biểu thức chính quy này có thể trích xuất giá từ hầu hết các trường hợp
Có một số vấn đề, mặc dù. Các bài toán đầu tiên là dấu phân cách thập phân và dấu phân cách hàng nghìn. Ở một số ngôn ngữ, dấu phẩy được sử dụng cho dấu phân cách thập phân và dấu chấm hoặc dấu cách được sử dụng cho dấu phân cách hàng nghìn
Ví dụ: mười nghìn euro và bốn mươi lăm xu được viết theo hai cách có thể sau
expression = '[\d\s.,]*'2
Mặt khác, các địa phương khác sử dụng dấu phẩy làm dấu phân cách thập phân và dấu chấm làm dấu phân cách hàng nghìn. Trong trường hợp đó, cùng một mức giá sẽ được viết như thế này
expression = '[\d\s.,]*'3
Để xử lý việc này, sẽ cần phải viết thêm mã
Cho đến nay, chúng tôi đã không nói về việc lấy tiền và làm sạch giá
Khi chúng tôi thêm nhiều trường hợp hơn, mã sẽ ngày càng phức tạp hơn
Đây là lúc điều quan trọng cần biết là đã có một gói được xuất bản trên Chỉ mục gói Python —Trình phân tích cú pháp giá
Gói phân tích giá
Trình phân tích giá là một gói nhằm mục đích làm cho việc phân tích cú pháp trích xuất giá và tiền tệ từ chuỗi thô dễ dàng hơn nhiều mà không cần đi sâu vào sự phức tạp để xử lý tất cả các trường hợp
Mặc dù Trình phân tích giá được viết để phân tích chuỗi giá đã loại bỏ, nhưng nó hoạt động với các tệp hoặc bất kỳ nguồn dữ liệu nào khác có chứa thông tin tiền tệ ở dạng chuỗi thô, chưa được xử lý
Gói phân tích giá có thể được cài đặt dễ dàng từ thiết bị đầu cuối
expression = '[\d\s.,]*'4
Nếu bạn đang sử dụng Anaconda, hãy lưu ý rằng nó KHÔNG khả dụng trên bất kỳ kênh nào và do đó bạn cũng sẽ phải sử dụng lệnh
expression = '[\d\s.,]*\d'6 ở đó
expression = '[\d\s.,]*'6
Trước khi khám phá cách sử dụng gói này, trước tiên, chúng ta phải hiểu lớp
expression = '[\d\s.,]*'7 của gói này
Lớp expression = '[\d\s.,]*'
7
Gói phân tích giá sử dụng một lớp đặc biệt để đại diện cho tiền tệ. Lớp này được đặt tên một cách khéo léo là
expression = '[\d\s.,]*'7. Lớp
expression = '[\d\s.,]*'7 có hai thuộc tính quan trọng
expression = '[\d\s.,]*'
11. Giá trị nhưexpression = '[\d\s.,]*'
12expression = '[\d\s.,]*'
13. Tiền tệ dưới dạngexpression = '[\d\s.,]*'
14
Nó cũng có một bộ mô tả dữ liệu
expression = '[\d\s.,]*'15, sẽ trả về số tiền là
expression = '[\d\s.,]*'16, thay vì
expression = '[\d\s.,]*'17
Với suy nghĩ này, hãy xem cách chúng ta có thể phân tích giá
Phân tích giá - Các trường hợp đơn giản
Trình phân tích giá hỗ trợ hai cách phân tích cú pháp. Đây không phải là những cách khác nhau mà chỉ là bí danh. Họ làm điều tương tự
Hai chức năng này là
expression = '[\d\s.,]*'
18expression = '[\d\s.,]*'
19
Chữ ký của các chức năng này như sau
expression = '[\d\s.,]*\d'0
Tham số bắt buộc duy nhất là chuỗi giá. Hai tham số còn lại là tùy chọn. Hàm này sẽ trả về một thể hiện của
expression = '[\d\s.,]*'7
Đây là ví dụ đầu tiên. Trong ví dụ này, có thể thấy cách sử dụng
expression = '[\d\s.,]*'11,
expression = '[\d\s.,]*'15 và
expression = '[\d\s.,]*'13
expression = '[\d\s.,]*\d'5
Đối với các trường hợp đơn giản, chỉ cần cung cấp chuỗi giá là đủ để phương thức hoạt động. Dưới đây là một số ví dụ khác
expression = '[\d\s.,]*'0
Giá phân tích cú pháp - Trường hợp phức tạp
Hàm
expression = '[\d\s.,]*'24 có thể xử lý các chuỗi không sạch và trích xuất số lượng giá và tiền tệ cho hầu hết các trường hợp
expression = '[\d\s.,]*'1
Thông thường, ký hiệu € được sử dụng làm dấu tách thập phân. Điều này được xử lý bởi Price Parser mà không cần bất kỳ điều chỉnh bổ sung nào
expression = '[\d\s.,]*'2
Các trường hợp khó khăn đã thảo luận trước đây, trong đó có thể sử dụng dấu cách hoặc dấu chấm vì hàng nghìn dấu phân cách được hỗ trợ ngay lập tức
expression = '[\d\s.,]*'3
Cả
expression = '[\d\s.,]*'25 và
expression = '[\d\s.,]*'26 đều được hiểu là
expression = '[\d\s.,]*'25. Ngoài ra, nếu số lượng hoặc đơn vị tiền tệ không thể được xác định bởi Trình phân tích giá, nó sẽ trả về một đối tượng
expression = '[\d\s.,]*'7 với
expression = '[\d\s.,]*'11 và/hoặc
expression = '[\d\s.,]*'13 sẽ được đặt thành
expression = '[\d\s.,]*'31
expression = '[\d\s.,]*'4
Gợi ý tiền tệ có thể được sử dụng nếu Trình phân tích giá không thể phát hiện tiền tệ. Ví dụ: Các Tiểu vương quốc Ả Rập Thống nhất Dirham được viết là cả AED và Dhs. Trình phân tích giá có thể xử lý AED, nhưng không thể xử lý Dhs. Trong trường hợp này,
expression = '[\d\s.,]*'32 hữu ích
expression = '[\d\s.,]*'5
Cuối cùng, nếu đã biết dấu tách thập phân, nó có thể được đặt bằng cách sử dụng đối số
expression = '[\d\s.,]*'33. Điều này sẽ đảm bảo rằng không có lỗi khi đoán dấu tách thập phân. Đây là một ví dụ