R语言系列:
stringr
是tidyverse
的字符串处理函数,和R语言原生的字符串处理函数相比,其API风格统一,功能完备,十分推荐使用
功能 | 函数 |
---|---|
拼接与分割 | str_c ;str_split, str_split_fixed |
定位;匹配;提取 | str_locate ;str_match ;str_extract ; |
删除;替换 | str_remove ;str_replace |
检测;计数 | str_detect ;str_count |
格式化 | str_glue |
头尾修饰 | 补齐str_pad ;删除str_trim, str_squish |
大小写转换 | str_to_lower, str_to_upper, str_to_title, str_to_sentence |
复制 | str_dup |
排序 | str_sort, str_order |
截取 | str_sub, str_subset, str_which |
字符串长度 | str_length |
str_c
为字符串拼接函数;可以拼接字符和字符数组,关键字collapse
为折叠符,用于连接数组内的字符;sep
为分隔符,用于连接数组间或者字符串间的字符。
library(stringr)
str_c("a","b") # 返回 ab
# 下面三个均返回a_b
str_c("a","b",sep = "_")
str_c(c("a"), c("b"), sep="_")
str_c(c("a","b"), collapse="_")
# 返回a/c_b/d
str_c(c("a","b"),c("c","d"),sep = "/",collapse = "_")
分割函数有两个,str_split
和str_split_fixed
,后者可以指定分割块数。参数pattern
表示分隔符,当pattern=""
时,将字符串分割成单个字符。通过simplify
可指定返回的数据类型,T
返回矩阵。
# 字符分割,"b" "a" "n" "a" "n" "a"
str_split("banana", "")
# 字符分割,返回矩阵
str_split("banana","a",simplify = T)
"返回值如下
[,1] [,2] [,3] [,4]
[1,] "b" "n" "n" ""
"
# 指定分割块数
str_split_fixed("banana", "", n = 3)
## [,1] [,2] [,3]
## [1,] "b" "a" "nana"
str_count
用于计数,str_detect
用于检测,二者的区别在于,检测只返回TRUE
或者FALSE
,计数则在此之上返回具体个数
# 单个目标字符计数,返回1 1 0
str_count(string = c("sql","json","java"),pattern = "s")
# 多个目标字符计数 返回1 1 2
str_count(string = c("sql","json","java"),pattern = c("s","j","a"))
# 元字符查找计数(fixed包裹元字符) 返回2
str_count(string = "a..b",pattern = fixed("."))
str_detect(string = c("sql","json","java"),pattern = "s")
## 返回 TRUE TRUE FALSE
定位、提取、匹配的操作逻辑是相似的,区别在于返回值,定位返回的是匹配字符的位置;提取和匹配则返回匹配值。而删除和替换功能则必须基于匹配、定位的基础上。这四种功能均有两种实现,后面带有_all
的,表示返回所有匹配,否则只匹配第一个。
定位 | str_locate | str_locate_all |
提取 | str_extract | str_extract_all |
匹配 | str_match | str_match_all |
删除 | str_remove | str_remove_all |
替换 | str_replace | str_replace_all |
此外,替换还有一个简单的str_replace_na
函数,用于将NA
替换成字符串"NA"
。
# 定位
> str_locate_all("banana", "an")
# [[1]]
# start end
# [1,] 2 3
# [2,] 4 5
# 匹配
str_match_all("banana", "an")
# [[1]]
# [,1]
# [1,] "an"
# [2,] "an"
# 提取
str_extract_all("banana", "an")
## [[1]]
## [1] "an" "an"
# 提取,返回矩阵
str_extract_all("banana", "an", simplify = T)
# [,1] [,2]
# [1,] "an" "an"
# 删除 返回"ba"
str_remove_all("banana", "an")
# 替换 返回bANANa"
str_replace_all("banana", "an", "AN")
尽管字符串格式化函数只有str_glue
,但头尾修饰、大小写转换也可以理解为一种格式化方案,所以归类在一起。
其中str_glue
的逻辑是,识别字符串中的{}
,并将花括号中的内容理解为变量,然后将变量转换为字符串,是很现代的处理方法
name <- "jack"
age <- 12
str_glue("I'm {name}, {age} years old.")
# 返回I'm jack, 12 years old.
str_pad
可在字符串的左右两侧添加单个字符;str_trim
可删除左右两侧的空格;str_squish
可删除字符串中多余的空格。
# 默认字符串左边补齐 width用于指定宽度 返回"00114514"
str_pad(string = "114514", width = 8, pad = "0")
# 字符串右边补齐 返回"114514xx"
str_pad("114514", 8, side = "right", pad = "x")
str_pad("114514", 8, "both", "0") # 返回01145140
str_trim(" I'm jack ") # 返回 "I'm jack"
str_squish(" I'm jack ") # 返回 "I'm jack"
大小写转换语句中,str_to_title
会将所有单词首字母转大写,其他字母小写;str_to_sentence
则只将句首第一个字母转为大写,其他字母小写。
stringr包中其他的有用函数,用于常见的字符处理。
# 字符转为小写
str_to_lower("I'm jack") # 返回 "i'm jack"
str_to_upper("I'm jack") # 返回 "I'M JACK"
str_to_title("I'm jack") # 返回 "I'm Jack"
str_to_sentence("I'm Jack") # 返回 "I'm jack"
str_sort
返回排序后的字符串数组;str_order
则返回排序后的索引向量。排序函数默认升序,若将decreasing
设为TRUE
,则采用降序
# 降序排序,返回"sql" "python" "json"
str_sort(c("sql","json","python"), decreasing = TRUE)
# 升序排序,返回索引向量 2 3 1
str_order(c("sql","json","pythn"))
str_sub
通过指定开始和结束位置,得到子串,当索引值为正时,表示正数,为负数表示倒数。str_subset, str_which
则通过匹配模式,过滤出满足模式的字符串。
# 字符过滤 从第1个到倒数第2个 返回 banan
str_sub("banana", start = 1,end = -2)
# 字符串过滤 ^s为正则表达式语法,表示是开头 返回 sql
str_subset(string = c("java","sql","python"),pattern = "^s")
# 字符串过滤,返回匹配字符串位置 返回2
str_which(string = c("java","sql","python"),pattern = "^s")
str_dup
可将字符向量重复若干次,并返回重复后的字符向量。
str_dup(c("I", "m", "jack"),times = 2)
## [1] "II" "mm" "jackjack"
str_length
可以返回字符串长度
str_length("banana") # 返回 6