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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容