Tìm giá trị khớp với Regex trong R
September 18, 2016 by Kinh Nguyen
regex
: regular expression (Xem một số lệnh regex cơ bản ở đây)
regex
là ngôn ngữ mạnh mẽ để tìm kiếm giá trị khớp với một điều kiện mong muốn được sử dụng trong hầu hết các phần mềm và ngôn ngữ lập trình. Ví dụ như tìm Google cũng là một dạng của regex
. Trong phân tích dữ kiện, regex
cực kỳ hữu ích để xử lý nhanh, mã hóa và chọn lọc dữ kiện. V.d. để tìm những người trả lời “không” trong một câu hỏi mở, bạn có thể tìm với cú pháp như *[kK]hông*
để bao hàm tất cả những đáp án như không
, Không
, không tui không biết
,…Dưới đây là sơ lược về ứng dụng trong R.
R cung cấp 7 hàm regex
trong package có sẵn base
. Tất cả đều mặc định là phân biệt chữ hoa chữ thường. Nếu không muốn chỉ cần chọn thêm tham số ignore.case=TRUE
. Để tránh các lỗi không tương thích với các phiên bản R khác nhau, khi dùng lệnh R nên gán tham số perl=TRUE
.
Tìm giá trị trong các vector ký tự
Hàm grep
lấy tham số đầu tiên là regex
, và tham số thứ hai là vector chứa nội dung cần tìm. Nếu thêm tham số value=FALSE
hoặc không dùng tham số này hàm grep
trả về một vector các vị trí trong vector khớp với regex
. Cách này là đủ dùng nếu bạn chắc về cú pháp regex
và dữ kiện có thể xử lý ngay dựa trên các giá trị này. Nếu chọn value=TRUE
, grep
trả về một vector với giá trị khớp có trong vector, cách này có thể giúp kiểm tra xem cú pháp lệnh mình tìm có đúng hay không.
> grep("a+", c("abc", "def", "cba a", "aa"), perl=TRUE, value=FALSE)
[1] 1 3 4
> grep("a+", c("abc", "def", "cba a", "aa"), perl=TRUE, value=TRUE)
[1] "abc" "cba a" "aa"
Hàm grepl
dùng giống như hàm grep
, ngoại trừ việc tham số value
không xài được. grepl
trả về một vector đúng/sai với cùng độ dài với vector đầu vào. Mỗi giá trị trong vector trả về cho biết vị trí tương ứng trong vector đầu vào có khớp với regex
không.
> grepl("a+", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1] TRUE FALSE TRUE TRUE
Hàm regexpr
nhận tham số giống grepl
, nhưng trả về một vector số nguyên cùng độ dài với vector đầu vào. Mỗi giá trị cho biết vị trí ký tự đầu tiên khớp với tìm kiếm trong mỗi chuỗi tương ứng. V.d. khớp ngay vị trí đầu tiên sẽ trả về giá trị 1
. Nếu không có giá trị nào khớp giá trị trả về là -1
. V.d. bên dưới "cba a"
có ký tự a
đầu tiên ở vị trí số 3.
> regexpr("a+", c("abc", "def", "cba a", "aa"), perl=TRUE)
[1] 1 -1 3 1
attr(,"match.length")
[1] 1 -1 1 2
Các lệnh trên là tương đối đủ dùng cho các dữ kiện bình thường, ngoài ra còn có hàm gregexpr
gần giống như regexpr
, hàm regmatches
dùng để lấy giá trị thật của chuỗi khớp với regex
. V.d.
> x <- c("abc", "def", "cba a", "aa")
> m <- regexpr("a+", x, perl=TRUE)
> regmatches(x, m)
[1] "a" "a" "aa"
> m <- gregexpr("a+", x, perl=TRUE)
> regmatches(x, m)
[[1]] [1] "a"
[[2]] character(0)
[[3]] [1] "a" "a"
[[4]] [1] "aa"
Giá trị, hoặc vị trí trả về qua tìm kiếm với các hàm trên có thể dùng để lọc, thay thế, chỉnh sửa giá trị trong dữ kiện theo mong muốn với cách căn bản như dùng như x[vector vị trí] <- vector thay thế
hoặc với hàm sub, gsub