2 min read

字符串处理包stringr学习笔记-1

suppressPackageStartupMessages(require(stringr))

R中的字符串处理函数,不但多,而且难记,参数调用方法也不一致。stringr包提供了统一名称的函数调用形式。

1. 基本处理

1.1 计算字符串的长度

str_length("abc")
## [1] 3
str_length("你好")
## [1] 16
str_length(NA)
## [1] NA
str_length(c("abc","ad","co"))
## [1] 3 2 2

str_length等同于R中自带的nchar()函数可以正确的识别中文字的个数,赞一个。

1.2 提取子字符串

下述函数可以针对向量操作,提取子字符串

x <-  c("abcdefgh","dljwowowjj")
str_sub(x,2,4) #从第2个位置到第四个位置
## [1] "bcd" "ljw"
str_sub(x,2,-2) #第二个位置到倒数第二个位置
## [1] "bcdefg"   "ljwowowj"

1.3 修改字符串中指定位置的内容

修改字符串中某个位置的字符

str_sub(x,3,5) <- "XYZ"
x
## [1] "abXYZfgh"   "dlXYZwowjj"

1.4 重复字符串的内容

str_dup(x,3) #表示每个字符串重复两次
## [1] "abXYZfghabXYZfghabXYZfgh"       "dlXYZwowjjdlXYZwowjjdlXYZwowjj"
str_dup(x,c(2,3)) #表示第一个字符串重复2次,第二个字符串重复3次
## [1] "abXYZfghabXYZfgh"               "dlXYZwowjjdlXYZwowjjdlXYZwowjj"

1.5 填补字符串至一定长度

str_pad(x,str_length(x[2])) #把第一个字符串用空格补充至跟第二字符串一样长
## [1] "  abXYZfgh" "dlXYZwowjj"
str_pad(string = x,width = str_length(x[2]),side = "right", pad = "?") #一个标准写法,用?号补充,在填补在右边
## [1] "abXYZfgh??" "dlXYZwowjj"

缩写字符串

str_trunc(x,3)
## [1] "..." "..."

默认的最小缩写字符串长度就是3(“…”),因此直接显示为“…”。

如果想缩写为2位,可以这样写:

str_trunc(x,2,ellipsis = ".")
## [1] "a." "d."

1.6 剔除字符串中的空格

x <- c("  a   ", "b   ",  "   c")
str_trim(x)
## [1] "a" "b" "c"

1.7 大小写转换+本地语言支持

x <- "You are beautiful."
str_to_lower(x) #转换为小写
## [1] "you are beautiful."
str_to_upper(x) #转换为大写
## [1] "YOU ARE BEAUTIFUL."
str_to_title(x) #首字母大写
## [1] "You Are Beautiful."
x <- "i love you"
str_to_upper(x,locale = "tr") #土耳其语,i带点
## [1] "I LOVE YOU"
#stringi::stri_locale_list() #语言支持列表

1.8 排名和排序

获得每个元素的排名

x <- c("a","y","i","o")
str_order(x)
## [1] 1 3 4 2
y <- c("ac","oa","bp","oo")
str_order(y)
## [1] 1 3 2 4

对y中的元素进行排序

str_sort(y)
## [1] "ac" "bp" "oa" "oo"
#另外一种实现方式
y[str_order(y)]
## [1] "ac" "bp" "oa" "oo"

降序排列

str_sort(x=y,decreasing = TRUE)
## [1] "oo" "oa" "bp" "ac"

字符类型的数字,支持按照数字大小排序

x <- as.character(c(sample(1:100,5),1000))
x
## [1] "18"   "86"   "29"   "48"   "52"   "1000"
str_sort(x)
## [1] "1000" "18"   "29"   "48"   "52"   "86"
str_sort(x,numeric =TRUE)
## [1] "18"   "29"   "48"   "52"   "86"   "1000"

1.9 合并字符串

str_c("I","love","this","world!",sep = " ")
## [1] "I love this world!"
str_c(c("2018","01","18"),collapse = "-")
## [1] "2018-01-18"

2 模式匹配

2.1 正则表达 regular expression

str_view()str_view_all()用来展示正则表达式是如何匹配的,是学习正则表达式的好帮手。

2.1.1 基础匹配

x <- c("apple", "banana", "pear")
str_view(x, "an")

接下来会稍微复杂一些,加入通配符.,匹配任何字符:

str_view(x,".a.")

但是如何匹配字符串中的.呢?我们需要一个逃脱符,也就是反斜杠\,英文是blackflash,\.

但是这里有一个问题,那就是在普通字符串处理中,R也定义了\是一个逃脱符,而正则表达式又是通过字符串表达出来的,因此,为了匹配.,需要写为\\.

writeLines("\\.")
## \.
str_view("b.a","\\.")

那么另外一个问题是,如何匹配文字\。根据规则,应该是\\。但是,要想在R中输出\\字符串(两个反斜杠),我们每个前边都需要再加一个反斜杠,这就变成了四个反斜杠\\\\

writeLines("\\\\")
## \\
str_view("a\\b","\\\\") 

2.1.2 引导符

如何匹配开头或者结尾字符。

^用于匹配开头。

$用于匹配结尾。

x <- c("apple", "banana", "pear")
str_view(x, "^a")
str_view(x,"a$")
str_view(x,"^pear$") #匹配完整字符串

如何匹配文字$^$

str_view("$^$","\\$\\^\\$")

一个小练习题,从stringr::words900多个单词中找出首字母是y的所有单词:

str_view(stringr::words,"^y",match = TRUE)

结尾是x的所有单词:

str_view(stringr::words,"x$",match = TRUE)

列出长度为11的所有单词:

str_view(stringr::words,"^.{11}$",match = TRUE)

2.1.2 匹配不同类型的字符

.匹配任何字符,其他类型的字符包括: * \d匹配任何数字 * \s匹配空格、制表符、换行符 * [abc]匹配abc中的任一个字符 * [^abc] 匹配除了abc以外的任一个字符

小小练习题。

查找元音字母打头的单词

str_view(stringr::words,"^[aeiou]",match = TRUE)

那些单词结尾是“ed”但不是“eed”的单词:

str_view(stringr::words,"[^e]ed$",match = TRUE)

筛选出结尾是ing或者ise的单词

str_view(stringr::words,"ing|ise$",match = TRUE)

验证字母q后边是否总是跟着字母u,也就是说查找那些q后边不是u的单词:

str_view(words,"q[^u]",match = TRUE)

结果是没找到。

验证另外一个字母搭配规则,i在e前或者是在c后边。

str_view(words,"ie|ci",match = TRUE)