I. Giới thiệu các hàm trong stringr

Nhóm các hàm convert uppercase, lowercase

Cú pháp chung:

strFunctionName(string, locale)

Argument:

  • string: chuỗi kí tự.
  • locale: Loại ngôn ngữ cần convert sang, mặc định tiếng anh.

Usage

  • str_to_upper(string,locale = ‘en’) : convert sang uppercase.
  • str_to_lower(string,locale = ‘en’) : convert sang lowercase.
  • str_to_title(string,locale = ‘en’) : convert sang dang title (chữ đầu của từ in hoa)
library(stringr)
#convert to uppercase
str_to_upper("Pham Dinh Khanh")
## [1] "PHAM DINH KHANH"
#convert to lowercase
str_to_lower("PHAM DINH KHANH")
## [1] "pham dinh khanh"
#convert to title
str_to_title("PHAM DINH KHANH")
## [1] "Pham Dinh Khanh"

muốn biết các kiểu locale mà stringr hỗ trợ

library(tidyverse)
library(stringi)
stringi::stri_locale_list() %>% head()
## [1] "af"     "af_NA"  "af_ZA"  "agq"    "agq_CM" "ak"

Nhóm các hàm xác định vị trí và extract

  • str_locate(string,pattern) : xác định vị bắt đầu kiểu pattern.
  • str_locate(string,pattern) : xác định vị trí bắt đầu và kết thúc của 1 nhóm kí tự đầu tiên thỏa mãn pattern.
  • str_sub(string,start,end): xác định chuỗi kí tự con từ vị trí bắt đầu tới vị trí kết thúc.
  • str_detect(string, pattern): Trả về giá trị logical. Phát hiện một kiểu pattern.
  • str_extract(string,pattern): lọc ra một chuỗi kí tự thỏa mãn pattern.
  • str_subset(string, pattern): Trả về một vector con của vector string thỏa mãn pattern.
numbers <- "1 and 2 and 4 and 456"
#Xác định vị trí đầu tiên là số
str_locate(numbers, "[0-9]+")[[1]]
## [1] 1
#Xác định các vị trí là số
num_loc <- str_locate_all(numbers, "[0-9]+")[[1]]
num_loc
##      start end
## [1,]     1   1
## [2,]     7   7
## [3,]    13  13
## [4,]    19  21
#Extract ra các số
str_sub(numbers,num_loc[,"start"],num_loc[,"end"])
## [1] "1"   "2"   "4"   "456"
#invert_match()  sử dụng để lấy các vị trí còn lại của num_loc
text_loc <- invert_match(num_loc)
#Extract các kí tự không là số
str_sub(numbers,text_loc[,"start"],text_loc[,"end"])
## [1] ""      " and " " and " " and " ""
#Chúng ta có một list trong đó có lẫn địa chỉ gmail
emailList <- c("phamdinhkhanh93@gmail.com","1231","nguyenvana@gmail.com","dktram@gmail.com","1993 boy")
#Để lọc gmail trong list trên trước tiên phải tạo pattern cho gmail.
pattern <- "@gmail.com"
#pattern trên là chứa chuỗi kí tự @gmail.com
#xác định kiểu pattern trên
str_detect(emailList,pattern)
## [1]  TRUE FALSE  TRUE  TRUE FALSE
#Lấy ra các email
emailList <- str_subset(emailList,pattern)
emailList
## [1] "phamdinhkhanh93@gmail.com" "nguyenvana@gmail.com"     
## [3] "dktram@gmail.com"
#Lấy ra các phần là số
str_extract("phamdinhkhanh93@gmail.com","[0-9]+")
## [1] "93"

Có thể tham khảo thêm ở link sau các hàm của stringr

https://cran.r-project.org/web/packages/stringr/stringr.pdf

II. Giới thiệu các kiểu regular expression

Các hiểu pattern dạng bracket

  • [0-9] : biểu thị kiểu pattern là số từ 0-9. Nếu muốn lấy các số từ 2-5 thì truyền parttern [2-5].

  • [^0-9] : không phải là các kí tự là số.

  • ’[a-z]: chỉ lấy chữ thường.

  • ’[A-Z]: chỉ lấy chữ hoa.

  • ’[^a-z]: không lấy chữ thường.

  • ’[^A-Z]: không lấy chữ hoa.

  • ’[a-zA-z]: các kí tự là chữ cái gồm chữ thường và chữ hoa

  • .: kí tự đơn không bao gồm dấu chấm câu và xuống dòng.

library(stringr)
#thay cac so bang rong
str_replace_all("abc123","[0-9]","")
## [1] "abc"
#chi thay so tu 1 den 2
str_replace_all("abc123","[1-2]","")
## [1] "abc3"
#loai cac ki tu khong phai la so
str_replace_all("abc123","[^0-9]","")
## [1] "123"
#loai cac ki tu la chu thuong
str_replace_all("abcABC123","[a-z]","")
## [1] "ABC123"
#loai cac ki tu khong phai chu hoa
str_replace_all("abcABC123","[A-Z]","")
## [1] "abc123"
#loai cac ki tu vua la chu hoa vua la chu thuong
str_replace_all("abcABC123","[a-zA-Z]","")
## [1] "123"
#loai cac ki tu khong la chu thuong
str_replace_all("abcABC123","[^a-z]","")
## [1] "abc"
#loai cac ki tu khong la chu hoa
str_replace_all("abcABC123","[^A-Z]","")
## [1] "ABC"
#loai chu hoac so khong in hoa
str_replace_all("abcABC123","[a-z|0-9]","")
## [1] "ABC"
#loai cac chu so
str_replace_all("abcABC123","[.123]","")
## [1] "abcABC"

Các kiểu pattern lặp lại

  • [0-9]{2}: 2 chữ số đứng cạnh nhau. Nếu muốn 3 chữ số đứng cạnh nhau thì [0-9]{3}.

  • [a-z]{2}: 2 chữ cái đứng cạnh nhau

#tim ki tu co 2 chu cai dung canh nhau
str_extract_all("ab123c567","[a-z]{2}")
## [[1]]
## [1] "ab"
#tim ki tu co 3 chu so dung canh nhau
str_extract_all("ab123c56d","[0-9]{3}")
## [[1]]
## [1] "123"

Các kiểu pattern vị trí

  • $: pattern xuất hiện ở cuối cùng.

  • ^: pattern xuất hiện đầu tiên.

emailList <- c("phamdinhkhanh93@gmail.com","1231","nguyenvana@gmail.com","dktram@gmail.com","1993 boy")
#tìm chuỗi kí tự xuất hiện ở cuối cùng là com
str_subset(emailList,"com$")
## [1] "phamdinhkhanh93@gmail.com" "nguyenvana@gmail.com"     
## [3] "dktram@gmail.com"
#tìm chuỗi kí tự xuất hiện đầu tiên là số
str_subset(emailList,"^[0-9]")
## [1] "1231"     "1993 boy"

Các kiểu Metacharacter:

  • . : Tìm một kí tự đơn lẻ.

  • \d: Tìm một chữ số.

  • \D: Tìm một kí tự không phải chữ số.

  • \w: Tìm một kí tự là chữ và số

  • \W: Tìm một kí tự không là chữ và số.

  • \s: Tìm 1 khoảng trắng.

  • \S: Tìm 1 kí tự không là khoảng trắng.

  • \b: TÌm một kí tự tại vị trí đầu và cuối của từ.

  • \B: TÌm một kí tự không phải là vị trí đầu và cuối của từ.

  • \0: TÌm một kí tự null

  • \n: TÌm kí hiệu newline

#lay ki tu don le
str_extract_all("abc d 12 f",".")
## [[1]]
##  [1] "a" "b" "c" " " "d" " " "1" "2" " " "f"
#lay ki tu don le co space o phia truoc
str_extract_all("abc d 12 f","\\s.")
## [[1]]
## [1] " d" " 1" " f"
#lay tat ca cac chu so
str_extract_all("abcABC123","\\d")
## [[1]]
## [1] "1" "2" "3"
#lay ki tu khong la chu so
str_extract_all("abcABC123","\\D")
## [[1]]
## [1] "a" "b" "c" "A" "B" "C"
#lay tat ca ki tu la chu
str_extract_all("abc ABC @ 123","\\w")
## [[1]]
## [1] "a" "b" "c" "A" "B" "C" "1" "2" "3"
#lay ki tu khong la khong la chu
str_extract_all("abc ABC @ 123","\\W")
## [[1]]
## [1] " " " " "@" " "
#lay ki tu khong la khoang trang
str_extract_all("abc ABC @ 123","\\S")
## [[1]]
##  [1] "a" "b" "c" "A" "B" "C" "@" "1" "2" "3"
#thay the ki hieu newline bang dau -
str_replace_all("cong hoa xa hoi chu nghia Viet Nam
                Doc lap tu do hanh phuc","\\n","-")
## [1] "cong hoa xa hoi chu nghia Viet Nam-                Doc lap tu do hanh phuc"

Các kiểu định lượng

  • n+: TÌm vị trí có ít nhất một kí hiệu n

  • n*: TÌm vị trí chứa 0 hoặc nhiều lần xuất hiện n

  • n?: TÌm vị trí chứa 0 hoặc 1 lần xuất hiện n

  • ^n: Khớp bất kì kí tự nào nếu n xuất hiện ở đầu tiên.

#lay cac ki tu chua it nhat 1 ki tu a
str_extract_all("aaabcda 123","a+")
## [[1]]
## [1] "aaa" "a"
#lay cac ki tu 0 hoac nhieu lan xuat hien a
str_extract_all("aaabcda 123","a*")
## [[1]]
##  [1] "aaa" ""    ""    ""    "a"   ""    ""    ""    ""    ""
#lay cac ki tu 0 hoac 1 lan xuat hien a
str_extract_all("aaabcda 123","a?")
## [[1]]
##  [1] "a" "a" "a" ""  ""  ""  "a" ""  ""  ""  ""  ""
#lay cac ki tu co a xuat hien o dau tien
str_extract_all(c("aaabcda 123","dfa","ab","ahihihi"),"^a")
## [[1]]
## [1] "a"
## 
## [[2]]
## character(0)
## 
## [[3]]
## [1] "a"
## 
## [[4]]
## [1] "a"

Các kiểu and () và or []

  • (): bắt buộc phải có pattern này
  • []: trong [] có nhiều kiểu pattern, và chỉ cần thỏa mãn một trong các pattern đó.
#tao mot choi co so dien thoai (co the ngan cach voi nhau boi dau -,+ hoac khong)
strings <- c(" 219+733 8965", "329-293-8753 ", "banana", "595 794 7569",
"387 287 6718", "apple", "233.398.9187 ", "482 952 3315",
"239 923 8115 and 842 566 4692", "Work: 579-499-7527", "$1000",
"Home: 543.355.3679")
#tao kieu cho phone co the cach nhau boi dau -,+ hoac khong
phone <- "([2-9][0-9]{2})[- +.]([0-9]{3})[- .]([0-9]{4})"
str_extract(strings,phone)
##  [1] "219+733 8965" "329-293-8753" NA             "595 794 7569"
##  [5] "387 287 6718" NA             "233.398.9187" "482 952 3315"
##  [9] "239 923 8115" "579-499-7527" NA             "543.355.3679"