R-tidyverse系列-stringr字符处理

stringr字符处理 - (jianshu.com)
dplyr表格操作 - (jianshu.com)

在正式学习stringrdplyr为代表的tidyrverse核心系列包时,有必要先了解下正则表达式以及管道符的相关知识。

正则表达式

  • . : 可以匹配除换行符外的任意字符
  • ? :表示前面的模式(无特殊情况即单个字符)重复0 次或 1 次。
    + :1 次或多次。
    * :0 次或多次。
    {n} :指定匹配 n 次。
    {n,} :指定匹配 n 次或更多次。
    {,m} :指定最多匹配 m 次。
    {n, m} :指定匹配 n 到 m 次
  • ^ 从字符串开头进行匹配
    $ 从字符串末尾进行匹配。
  • \d:匹配数字
    \s:可以匹配任意空白符
    \b:匹配单词间的边界

创建包含\(例如\d\s...)的正则表达式,需要在字符串中对\进行转移,即\\d\\s。其实只要记住\\本质上代表\即可。

匹配特殊字符示例

如果只是想匹配字符串本身的含义,fixed(正则表达式)可将正则表达式相关字符当作纯文本字符看待。

  • [abc]:可以匹配a、b,或c
    [^abc]:可以匹配除a、b,c外的任意字符
    [a-z] : 匹配任意小写字母;[A-Z]:任意大写字母;[A-z]:任意字母
    |表示或,常搭配小括号,例如gr(e|a)y表示匹配grey或者gray

  • [:digit:]:匹配数字
    [:alpha:]:匹配字母
    [:lower:]:匹配小写字母
    [:upper:]:匹配大写字母
    [:alnum:]:匹配字母/数字
    [:punct:]:匹配标点符号
    [:blank:]:匹配空格、tab
    [:space:]:匹配空格、tab、换行符

  • 最后的话,()小括号可以用于表示分组,\1表示回溯引用第一个分组,具体用法可参考下面的str_match()函数的介绍。

fruit = c("apple","banana","pear","pineapple")
#查找具有ABAB模式的字符串
str_view(fruit,"(.)(.)\\1\\2", match = T)

注意:默认的正则匹配方式都是“贪婪的”,即正则表达式会在符合规则的前提下匹配尽量长的字符串。通过在正则表达式后面添加一个 ? ,你可以将匹配方式更改为“懒惰的”,即匹配尽量短的字符串。

管道符%>%

  • magrittr包提供的管道符语法对于R语言的代码处理过程大大提高了效率,可通过下述方式查看内置官方文档;
?magrittr::`%>%
  • 在加载dplyr包时会自动加载magrittr包,从而便捷的使用管道符操作;
  • 管道符的含义理解,如下图所示;


  • 相关笔记可参考 https://zhuanlan.zhihu.com/p/29845549

stringr字符处理

1、字符串向量特征匹配
2、字符串特征匹配(取子集)
3、字符串的替换修改
4、字符串格式相关
5、字符串拼接与拆分

library(stringr)

https://github.com/rstudio/cheatsheets/blob/master/strings.pdf

1、字符串向量特征匹配

对于一个字符串向量,判断其中哪些字符串是否具有给定的模式特征

  • 1.1 str_detect():判断每个字符串是否具有匹配模式,返回等长的逻辑值向量
fruit <- c("apple", "banana", "pear", "pinapple")
str_detect(fruit, "a") #包含a的字符串
str_detect(fruit, "a", negate = T) #不包含a的字符串
str_detect(fruit, "^a") #以a开头的字符串
str_detect(fruit, "[aeiou]") #含有aeiou其中任意一个字符的字符串
  • 1.2 str_starts()/str_ends():判断每个字符串的开头/结尾是否具有匹配模式,同样返回等长的逻辑值向量
fruit <- c("apple", "banana", "pear", "pinapple")
str_starts(fruit, "p")
str_ends(fruit, "e")
  • 1.3 str_which()/str_subset():判断向量里的哪个字符串具有匹配模式;前者返回数字序号,后者返回具体的字符串
# str_which == which(str_detect(x, pattern))
# str_detect == x[str_detect(x, pattern)]
fruit <- c("apple", "banana", "pear", "pinapple")
str_subset(fruit, "a")
str_which(fruit, "a")
  • 1.4 str_locate() : 返回匹配的模式在字符串的起始位置
fruit <- c("apple", "banana", "pear", "pineapple")
str_locate(fruit, "a")
str_locate_all(fruit, "a")
  • 1.5 str_count():返回每个字符串内有多少个符合匹配模式组成
fruit <- c("apple", "banana", "pear", "pineapple")
str_count(fruit, "a")
str_count(fruit, c("a", "b", "p", "p")) #向量化操作

2、字符串特征匹配(取子集)

  • 2.1 str_sub():指定字符串的起始位置提取
hw <- "Hadley Wickham"
str_sub(hw, 1, 6)
str_sub(hw, -3, -1)
  • 2.2 str_extract() : 提取字符串里的特征模式
shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2")
str_extract(shopping_list, "\\d")  #提取数字
str_extract(shopping_list, "[a-z]+") #提取1至多个小写字母
str_extract(shopping_list, "[a-z]{1,4}") #贪婪匹配
str_extract(shopping_list, "[a-z]{1,4}?") #懒惰匹配
str_extract(shopping_list, "\\b[a-z]{1,4}\\b") #提取特征模式的单词
str_extract(shopping_list, fixed("\\b[a-z]{1,4}\\b")) #fixed可将正则表达式视为普通字符串

#str_extract 默认只提取字符串里第一个符合的模式
#str_extract_all可以提取全部的匹配
str_extract_all(shopping_list, "[a-z]+")
str_extract_all(shopping_list, "\\b[a-z]+\\b")
  • 2.3 str_match() : 可分组提取字符串里的特征模式,更加灵活。
    搭配括号使用,可提取分组的内容。该函数返回一个矩阵:第一列是完整匹配,第二列及以后是每个分组(括号)的匹配。适用于启发式的匹配提取,例如前缀、后缀等
str_match("bacad","b(a)")  #提取前一个字符为b的a
str_match("bacad","[^b](a)") ##提取前一个字符不为b的a
#回溯引用
str_match("banana","(a)(.)(\\1\\2)") #提取aXaX的模式文本,其中X可以是任何文本

3、字符串的替换修改

  • str_replace()
?str_replace #默认只替换第一个模式的文本
?str_replace_all #全部
fruits = c("apple","banana","pear")
str_replace(fruits, "[aeiou]", "-")
#回溯应用,下面表示将a替换为aa,e替换为ee
str_replace(fruits, "([aeiou])", "\\1\\1")

#向量化一对一替换
str_replace(fruits, "[aeiou]", c("1", "2", "3"))
str_replace_all(fruits, "[aeiou]", c("1", "2", "3"))
str_replace(fruits, c("p", "e", "a"), "-") 
str_replace_all(fruits, c("p", "e", "a"), "-") 

#  多种特定模式的替换,仅限于str_replace_all
fruits %>%
  str_c(collapse = "---") %>%
  str_replace_all(c("one" = "1", "two" = "2", "three" = "3"))

4、字符串格式相关

  • 4.1 str_length():返回每个字符串的长度
str_length(c("i", "like", "programming", NA))
  • 4.2 str_pad():将字符串填补至指定长度,默认用空格填充
rbind(
  str_pad("hadley", 30, "left"),
  str_pad("hadley", 30, "right"),
  str_pad("hadley", 30, "both")
)
str_pad("a", 10, pad = c("-", "_", " "))
  • 4.3 str_trunc():限制字符串的长度,用省略号代替
x <- "This string is moderately long"
rbind(
  str_trunc(x, 20, "right"),
  str_trunc(x, 20, "left"),
  str_trunc(x, 20, "center")
)
  • 4.4 str_trim():去除字符串两边的空格(包括tab、换行符);
    str_squish():去除字符串两边的空格(tab、换行符),以及替换所有两个以上的空格为一个空格
str_trim("  String with trailing and leading white space\t")
str_trim("\n\nString with trailing and leading white space\n\n")
str_squish("  String with trailing,  middle, and leading white space\t")
  • 4.5 str_wrap():将太长的英语句子限制为每行仅包含指定长度字符的若干行文本(本质上即为自动插入换行符);首要前提需要为包含空格的字符串
sentences[1]
cat(str_wrap(sentences[1],width = 10))
  • 4.6 str_glue():使用占位符格式化输出,类似于sprintf()
name <- "Fred"
age <- 50
str_glue("My name is {name}, my age next year is {age + 1}")
mtcars[1:3,] %>% str_glue_data("{rownames(.)} has {hp} hp")
  • 4.7 大小写转换
dog <- "The quick brown dog"
##变大写
str_to_upper(dog)
##变小写
str_to_lower(dog)
##首字母大写
str_to_title(dog)

5、字符串拼接与拆分

  • str_c():拼接两个字符串,默认连接符为空白
str_c("Letter-", letters)
str_c("Letter", letters, sep = ": ")
str_c(letters, collapse = "")
  • str_dup() 重复字符串`
fruit <- c("apple", "pear", "banana")
str_dup(fruit, 2)
str_dup(fruit, 1:3)
  • str_split() 拆分字符串,默认返回的是list,可设置simplify=T参数返回矩阵
fruits <- c(
  "apples and oranges and pears and bananas",
  "pineapples and mangos and guavas"
)
str_split(fruits, " and ")
str_split(fruits, " and ", simplify=T)

#限定分割得到的字符串的数量(从左到右)
str_split(fruits, " and ", n = 2)
str_split(fruits, " and ", n = 3)
str_split(fruits, " and ", n = 5)

你可能感兴趣的:(R-tidyverse系列-stringr字符处理)