6.stringr处理字符串

一、字符串基础

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

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,180评论 0 3
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,233评论 0 4
  • 一、字符串在C#中,字符串是一系列不可修改的Unicode字符,创建字符串后,就不能修改它。要创建字符串,最常用的...
    CarlDonitz阅读 1,277评论 0 2
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,306评论 0 9