R数据科学chapter10 #使⽤stringr处理字符串
#正则表达式(regular expression,regexp)
library(tidyverse)
library(stringr)
#字符串基础
#可以使⽤单引号或双引号来创建字符串。
#与其他语⾔不同,单引号和双引号在 R 中没有区别。
#我们推荐使⽤ ",除⾮你想要创建包含多个 " 的⼀个字符串
string1 <- "This is a string"
string2 <- 'To put a "quote" inside a string, use single quotes'
#如果忘记了结尾的引号,你会看到⼀个 +,这是⼀个续⾏符:
#如果遇到了这种情况,可以按 Esc 键,然后重新输⼊。
#如果想要在字符串中包含⼀个单引号或双引号,可以使⽤ \ 对其进⾏“转义”
double_quote <- "\"" # or '"'
single_quote <- '\'' # or "'"
#这意味着,如果想要在字符串中包含⼀个反斜杠,就需要使⽤两个反斜杠:\\。
#字符串的打印形式与其本⾝的内容不是相同的,因为打印形式中会显⽰出转义字符。
#如果想要查看字符串的初始内容,可以使⽤ writelines() 函数
x <- c("\"", "\\")
x
#> [1] "\"" "\\"
writeLines(x)
#> "
#> \
#最常⽤的是换⾏符 \n 和制表符 \t
x <- "\u00b5"
x
#> [1] "μ"
writeLines(x)
#多个字符串通常保存在⼀个字符向量中,你可以使⽤ c() 函数来创建字符向量
c("one", "two", "three")
#> [1] "one"  "two"  "three"
#字符串长度
#我们将使⽤ stringr 中的函数,这些函数的名称更直观,并且都是以 str_ 开头的。#str_length() 函数可以返回字符串中的字符数量:
str_length(c("a", "R for data science", NA))
#字符串组合
#要想组合两个或更多字符串,可以使⽤ str_c() 函数:
str_c("x", "y")
#> [1] "xy"
str_c("x", "y", "z")
#> [1] "xyz"
#可以使⽤ sep 参数来控制字符串间的分隔⽅式:
str_c("x", "y", sep = ", ")
#> [1] "x, y"
#缺失值是可传染的。
#如果想要将它们输出为 "NA",可以使⽤ str_ replace_na():
x <- c("abc", NA)
str_c("|-", x, "-|")
#> [1] "|-abc-|" NA
str_c("|-", str_replace_na(x), "-|")
#> [1] "|-abc-|" "|-NA-|"
#str_c() 函数是向量化的,它可以⾃动循环短向量,
#使得其与最长的向量具有相同的长度:
str_c("prefix-", c("a", "b", "c"), "-suffix")
#长度为 0 的对象会被⽆声⽆息地丢弃。这与 if 结合起来特别有⽤:
name <- "Hadley"
time_of_day <- "morning"
birthday <- FALSE
str_c(
"Good ", time_of_day, " ", name,
if (birthday) " and HAPPY BIRTHDAY",
"."
)
#要想将字符向量合并为字符串,可以使⽤ collapse() 函数:
str_c(c("x", "y", "z"), collapse = ", ")
#字符串取⼦集
# str_sub() 函数来提取字符串的⼀部分
#str_sub() 函数中还有 start 和 end 参数,
#它们给出了⼦串的位置(包括 start 和 end 在内)
x <- c("Apple", "Banana", "Pear")
str_sub(x, 1, 3)
# 负数表⽰从后往前数
str_sub(x, -3, -1)
#即使字符串过短,str_sub() 函数也不会出错,它将返回尽可能多的字符str_sub("a", 1, 5)
#str_sub() 函数的赋值形式来修改字符串
str_sub(x, 1, 1) <- str_to_lower(str_sub(x, 1, 1))
x
#区域设置
# str_to_lower() 函数将⽂本转换为⼩写,
#你还可以使⽤ str_to_upper() 或 str_to_title() 函数。
#不同的语⾔有不同的转换规则。
#你可以通过明确区域设置来选择使⽤哪种规则
# ⼟⽿其语中有带点和不带点的两个i,它们在转换为⼤写时是不同的:
str_to_upper(c("i", "ı"))
#> [1] "I" "I"
str_to_upper(c("i", "ı"), locale = "tr")
#> [1] "İ" "I"
#区域设置可以参考 ISO 639 语⾔编码标准,语⾔编码是 2 或 3 个字母的缩写。
#R 基础包中的 order() 和 sort() 函数使⽤当前区域设置对字符串进⾏排序。
#str_sort() 和 str_order() 函数可以使⽤ locale 参数来进⾏区域设置
#使⽤正则表达式进⾏模式匹配
#通过 str_view() 和 str_view_all() 函数来学习正则表达式
#这两个函数接受⼀个字符 向量和⼀个正则表达式,并显⽰出它们是如何匹配的。
#最简单的模式是精确匹配字符串:
x <- c("apple", "banana", "pear")
str_view(x, "an")
#另⼀个更复杂⼀些的模式是使⽤ .,它可以匹配任意字符(除了换⾏符)
str_view(x, ".a.")
writelines方法的参数可以是
#可以匹配任意字符,那么如何匹配字符 . 呢?
#你需要使⽤⼀个“转义”符号来告诉正则表达式实际上就是要匹配 . 这个字符,⽽不是使⽤ . 来匹配其他字符#如果要匹配 .,那么你需要的正则表达式就是 \.
#因为我们使⽤字符串来表⽰正则表达式,⽽且 \ 在字符串中也⽤作转义字符,
#所以正则表达式 \. 的字符串形式应是 \\.
## 要想建⽴正则表⽰式,我们需要使⽤\\
dot <- "\\."
# 实际上表达式本⾝只包含⼀个\:
writeLines(dot)
#> \.
# 这个表达式告诉R搜索⼀个.
str_view(c("abc", "a.c", "bef"), "a\\.c")
#如果 \ 在正则表达式中⽤作转义字符,那么如何匹配 \ 这个字符呢?
#我们还是需要去除其特殊意义,建⽴形式为 \\ 的正则表达式。
#要想建⽴这样的正则表达式,我们需要使⽤⼀个 字符串,其中还需要对 \ 进⾏转义。
#这意味着要想匹配字符 \,我们需要输⼊ "\\\\"
#你需要 4 个反斜杠来匹配 1 个反斜杠!
x <- "a\\b"
writeLines(x)
str_view(x, "\\\\")
#本书将正则表达式写作 \.,将表⽰正则表达式的字符串写作 "\\."。
#锚点
#正则表达式会匹配字符串的任意部分。
#我们需要在正则表达式中设置锚点,以便 R 从字符串的开头或末尾进⾏匹配。
#· ^ 从字符串开头进⾏匹配。
#· $ 从字符串末尾进⾏匹配。
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$")
#字符类与字符选项
#很多特殊模式可以匹配多个字符。
#· \d 可以匹配任意数字。
#· \s 可以匹配任意空⽩字符(如空格、制表符和换⾏符)。
#· [abc] 可以匹配 a、b 或 c。
#· [^abc] 可以匹配除 a、b、c 外的任意字符。
#要想创建包含 \d 或 \s 的正则表达式,
#你需要在字符串中对 \ 进⾏转义,因此需要输⼊ "\\d" 或 "\\s"。
#使⽤字符选项创建多个可选的模式
#abc|d..f 可以匹配 abc 或 deaf
#因为 | 的优先级很低,所以 abc|xyz 匹配的是 abc 或 xyz,⽽不是 abcyz 或 abxyz。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。