![](https://img.haomeiwen.com/i9475888/083ddfca36836549.png)
1.准备工作
library(tidyverse)
library(stringr)
2.字符串基础
单引号和双引号没有区别
转义符号\,对于反斜杠和引号需要转义。可是我这里发现了一个问题,理论上
double_quote <- "\""
应该是正确的双引号,然而并不是,用writeLines("\"")
就对了。
![](https://img.haomeiwen.com/i9475888/8713eeefb6107d33.png)
![](https://img.haomeiwen.com/i9475888/e65c04564df581aa.png)
原文说,“如果想要查看字符串的初始内容,可以使用writelines() 函数”,实际上意思应该是去掉转义符号和引号,只显示单纯的转义后的字符串,也就是计算机看到的内容。
洲更大神解答了这个问题:
![](https://img.haomeiwen.com/i9475888/b4c422aa3761f5d5.png)
是的,你看到的带了转义符号,计算机看到的是转义成功的!
几种特殊符号:
符号 | 意义 |
---|---|
\t | 制表符 |
\n | 换行 |
\u00b5 | μ |
2.1字符串长度
str_length(c("a", "R for data science", NA))
#> [1] 1 18 NA
手动数了一下,发现空格也算一个字符长度。
2.2 字符串组合与拆分
其实我觉得更恰当的说法应该是连接。
str_c("x", "y") #连接两个
#> [1] "xy"
str_c("x", "y", "z")#连接三个
#> [1] "xyz"
str_c("x", "y", sep = ", ")#有分隔符的连接
#> [1] "x, y"
#补充:
str_c(c("x", "y"), collapse = ",")
#对一个向量中的几个字符串进行连接用collapse。
处理NA,str_replace_na()
str_c()
函数是向量化的,它可以自动循环短向量,使得其与最长的向量具有相同的长度。
也就是说,你要连接一个含有c(a,b)和x,就会把a和b拆开,后面各自加上x。
![](https://img.haomeiwen.com/i9475888/3243ab8d322ab392.png)
同理前后连接也是一样的:
![](https://img.haomeiwen.com/i9475888/b2f89e93a7027f75.png)
这段代码我一开始没有看懂
name <- "Hadley"
time_of_day <- "morning"
birthday <- FALSE
str_c(
"Good ", time_of_day, " ", name,
if (birthday) " and HAPPY BIRTHDAY",
"."
)
#> [1] "Good morning Hadley."
然后把birthday改成了TRUE试试:
name <- "Hadley"
time_of_day <- "morning"
birthday <- TRUE
str_c(
"Good ", time_of_day, " ", name,
if (birthday) " and HAPPY BIRTHDAY",
"."
)
#>[1] "Good morning Hadley and HAPPY BIRTHDAY."
只要认清birthday是个逻辑值就懂咯,不懂就改改看。
拆分
要想将字符向量合并为字符串,可以使用collapse() 函数:
str_c(c("x", "y", "z"), collapse = ", ")
#> [1] "x, y, z"
2.3 用str_sub() 函数来提取字符串的一部分
x <- c("Apple", "Banana", "Pear")
str_sub(x, 1, 3)
#> [1] "App" "Ban" "Pea"
# 负数表示从后往前数,
str_sub(x, -3, -1)#倒数第三个到倒数第一个字符
#> [1] "ple" "ana" "ear"
#注意,即使字符串过短,str_sub() 函数也不会出错,它将返回尽可能多的字符:
str_sub("a", 1, 5)
#> [1] "a"
2.4 区域设置
蒙在这个题目上的应该不止我自己吧。
意思是不同语言的转换大小写和排序,语言有自己的编码标准ISO 639 ,比如英语是en。
大小写转换
函数 | 意义 |
---|---|
str_to_lower() | 大写变小写 |
str_to_upper() | 小写变大写 |
str_to_title() | 首字母大写 |
![](https://img.haomeiwen.com/i9475888/39f3f23e43d92321.png)
排序:
英文的排序是a-z这样。其他语言不知道。
x <- c("apple", "eggplant", "banana")
str_sort(x, locale = "en") # 英语
#> [1] "apple" "banana" "eggplant"
str_sort(x, locale = "haw") # 夏威夷语
#> [1] "apple" "eggplant" "banana"
3.使用正则表达式进行模式匹配
通过str_view() 和str_view_all() 函数来学习正则表达式。这两个函数接受一个字符向量和一个正则表达式,并显示出它们是如何匹配的。
3.1 基础匹配
精确匹配字符串:
x <- c("apple", "banana", "pear")
str_view(x, "an")
用"."任意字符匹配(除了换行符):
str_view(x, ".a.")
好像是同一个字符串里只匹配一次哦。看banana其实可以匹配到两次
![](https://img.haomeiwen.com/i9475888/bcbac990831d5531.png)
需要匹配”.“需要用正则表达式转义:
搜索一个"."
str_view(c("abc", "a.c", "bef"), "\\.")
中间的反斜杠和“.”连起来表示一个正常的点儿。第一个反斜杠表示匹配。
x <- "a\\b"
writeLines(x)
#> a\b
str_view(x, "\\\\")
四个反斜杠表示匹配一个普通的反斜杠!
后两个表示一个正常的反斜杠,前两个表示匹配用的正常的反斜杠,啊。
3.3 锚点--以什么开头,或以什么结尾
• ^ 从字符串开头进行匹配。
• $ 从字符串末尾进行匹配。
x <- c("apple", "banana", "pear")
str_view(x, "^a")
str_view(x, "a$")
强制正则表达式匹配一个完整字符串。
x <- c("apple pie", "apple", "apple cake")
str_view(x, "apple")
str_view(x, "^apple$")
3.5 字符类与字符选项
符号 | 意义 |
---|---|
\\d | 任意数字 |
\\s | 任意空白字符,如空格,制表符和换行符 |
[abc] | a、b、c |
[^abc] | 除了a、b、c外的任意字符 |
|连接两个不同的匹配,用括号使表达更清晰,(类似于加减乘除是否需要加括号,优先级)
str_view(c("grey", "gray"), "gr(e|a)y")
3.7 重复
控制一个模式能匹配多少次
• ?:0 次或1 次。
• +:1 次或多次。
• *:0 次或多次。
x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"
str_view(x, "CC?")
str_view(x, "CC+")
str_view(x, 'C[LX]+')
注意:这个地方中文书有误,str_view(x, "CC?")
匹配到的是两个C,而非三个
![](https://img.haomeiwen.com/i9475888/8c751940332493c3.png)
精确设置匹配的次数。
• {n}:匹配n 次。
• {n,}:匹配n 次或更多次。
• {,m}:最多匹配m 次。
• {n, m}:匹配n 到m 次。
如果你选的是一个区间,正则表达式会匹配尽量长。在表达式后面加一个?可以改为匹配尽量短。
![](https://img.haomeiwen.com/i9475888/ff071fb70cf88025.png)
3.9分组与回溯引用
str_view(fruit, "(..)\\1", match = TRUE)
fruit是个自带的向量,括号表示优先级,\1表示第一组,第一个反斜线表示转义。
![](https://img.haomeiwen.com/i9475888/ab4727d22397b2a2.png)
(补充:这里看的有点懵,其实就只有一组。如果多组,就是多个括号连写,是带有顺序的,依次表示第1,2,3组)
做了以下尝试:
str_view(fruit, "(..)\\1")
,去掉match,只匹配到连续的anan![](https://img.haomeiwen.com/i9475888/588b0893da6bb01b.png)
str_view(fruit, "(.)\\1", match = TRUE)
去掉一个点,匹配到了叠字![](https://img.haomeiwen.com/i9475888/a7d25d06f606006b.png)
str_view(fruit, "(.)\\1")
去掉match,去掉点,只显示匹配到的所有叠字![](https://img.haomeiwen.com/i9475888/d38affb84bb14129.png)
网友评论