一、字符串基础
library(tidyverse)
library(stringr)
##字符串组合
str_c("x", "y", "z")
str_c("x", "y", sep = ",")
x <- c("abc", NA)
str_c("|", x, "|") # NA是可以传染的
str_c("|", str_replace_na(x), "|") # str_replace_na()可以将NA转换成字符
str_c("prefix-", c("a", "b", "c"), "-suffix", "") # 可以自动循环短向量,且长度为0的向量被自动丢弃
str_c('a','b',sep='-') #sep可设置连接符
str_c('a','b', 'c', sep='-') #sep可设置连接符
str_c(c('a','a1'),c('b','b1'),sep='-')
str_c('a', 'b', collapse = "-") # collapse参数,对多个字符串无效
str_c('a', 'b', 'c', collapse = "-") # collapse参数,对多个字符串无效
str_c(c('a','a1'),c('b','b1'),collapse="-") # collapse参数对向量有效
head(letters)
str_c(head(letters), collapse = ", ") #把多个向量参数拼接为一个大的字符串
##字符串长度
str_length(c("a", "R for data science", NA))
##字符串取子集
x <- c("apple", "banana", "pear")
str_sub(x, 1, 3) # 1和3表示开始和结束字符位置,和python不同,字符由1开始
str_sub(x, -3, -1) # 负数表示从后往前最后一位同样是1(负一)
str_sub("a", 1, 5) # 即使字符串过短,也不会出错,但是它会尽可能返回更多字符
##区域设置
##使用locale参数设置,区域设置参考ISO 639语言编码系统,可以在维基百科查看List of ISO 639-1 codes
str_to_upper("i")
str_to_upper("i", locale = "tr")
二、正则表达进行模式匹配
# .可以匹配换行符以外的所有字符
# \d可以匹配任意数字
# \s可以匹配任意空白字符(如空格、制表符、换行符)
# [abc]可以匹配a,b和c
# [^abc]可以匹配除a,b,c以外的任意字符
# |可以创建多选模式,优先级很低(最后运算)
# ?表示其前字符匹配0次或1次,优先级很高
# +表示其前字符匹配1次或多次,优先级很高
# *表示其前字符匹配0次或多次,优先级很高
# {n, m}精确匹配n到m次,也可以用{n}, {n, }, {, m}
# ()可以消除复杂表达式中因优先级引起的歧义
# ()还可以回溯引用或者提取(\1,\2等)
三、具体使用
1.匹配检测
##str_detect()返回是否匹配
x <- c("apple", "banana", "pear")
str_detect(x, "e") # 返回与输入向量长度相同的逻辑向量(T/F代表是否符合匹配条件)
class(words)
df <- tibble(word = words, i = seq_along(words))
df %>% filter(str_detect(words, "x$"))
##str_count()返回匹配数量
str_count(x, "a") # 返回每个字符中含有"a"的数量
str_count("abababa", "aba") # 注意匹配是不会出现重叠的
2.提取匹配内容
##str_subset()提取符合匹配条件的字符
str_subset(words, "x$")
##str_extract()
stringr::sentences
has_color <- str_subset(sentences, "red|green|blue|yellow")
str_extract(has_color, "red|green|blue|yellow") # 只提取第一个匹配
str_extract_all(has_color, "red|green|blue|yellow") #提取所有匹配,返回一个列表
str_extract_all(has_color, "red|green|blue|yellow", simplify = T) #提取所有匹配,返回一个矩阵
3.分组匹配
sentences %>% str_subset("(a|the) ([^ ]+)")
sentences %>% str_subset("(a|the) ([^ ]+)") %>% str_extract("(a|the) ([^ ]+)") # 单独提取符合条件的数据
sentences %>% str_subset("(a|the) ([^ ]+)") %>% str_match("(a|the) ([^ ]+)") # 除提取符合条件的列外,括号括起来的列也被单独提取
sentences %>% str_subset("(a|the) ([^ ]+)") %>% str_match("(a|the) [^ ]+")
sentences %>% str_subset("(a|the) ([^ ]+)") %>% str_match_all("(a|the) ([^ ]+)") # 注意其返回的是个矩阵
4.替换匹配内容
x <- c("apple", "banana", "pear")
str_replace(x, "[aeiou]", "-") # 单纯替换
str_replace_all(x, "[aeiou]", "-")
x <- c("1 hours", "2 hours", "3 hours")
str_replace_all(x, c("1" = "one", "2" = "two", "3" = "three")) # 多个替换
5.拆分
sentences %>% head(5) %>% str_split(" ") # 其返回的必然是个列表
"a|b|c|d|e" %>% str_split("\\|")
"a|b|c|d|e" %>% str_split("\\|") %>% .[[1]] # 如果只有一个字符提取即可
sentences %>% head(5) %>% str_split(" ", simplify = T) # 可以设置simplify = T返回一个矩阵
"a|b|c|d|e" %>% str_split("\\|", simplify = T)
sentences %>% head(5) %>% str_split(" ", n = 4, simplify = T) # 可以设定拆分最大片段
sentences[1]
sentences[1] %>% str_split(" ") %>% .[[1]]
sentences[1] %>% str_split(boundary("word")) %>% .[[1]] # 根据字母、行、句子或者单词边界(boundary())拆分
6.定位匹配内容
str_locate() # 精确匹配开始位置和结束位置
str_locate_all()
7.其他参数
##regex()函数,当使用字符串作为匹配模式时,R会自动调用regex()进行包装
str_extract(c("banana", "apple", "orange"), "nana")
str_extract(c("banana", "apple", "orange"), regex("nana"))
str_extract(c("banana", "Banana", "BANANA"), regex("nana"))
str_extract(c("banana", "Banana", "BANANA"), regex("nana", ignore_case = T)) # regex内设置ignore_case = T不区分大小写
str_extract("line1\nline2\nline3", "^line")
str_extract("line1\nline2\nline3", regex("^line", multiline = T))
str_extract_all("line1\nline2\nline3", "^line")
str_extract_all("line1\nline2\nline3", regex("^line", multiline = T)) # regex内设置multiline = T表示从每一行的开始匹配
phone <- regex("
\\(? # 可选的开括号
(\\d{3}) # 地区编码
[)-] # 可选的闭括号或短划线
(\\d{3}) # 另外三个数字
[ -] # 可选的空格或短划线
(\\d{3}) # 另外三个数字",
comments = T)
str_match("514-791-8141", phone) # regex内设置comments = T可加入注释
##除regex()外还有fixed()和coll()两种匹配方式
8.其他应用
apropos() # 在全局环境中搜索匹配对象
dir(pattern = "\\.Rmsd$") # dir()中的pattern参数可以匹配相似模式的文件名
9.额外扩展可深入研究stringi