R数据科学|第十章内容介绍(二)

简介: 本章通过学习字符串的处理,再结合正则表达式进行正确的模式匹配。

使用正则表达式进行模式匹配

我们通过str_view()str_view_all()函数来学习正则表达式。这两个函数接受一个字符向量和一个正则表达式,并显示出它们是如何匹配的。

基础匹配

str_view 是查看string是否匹配pattern,如果匹配就高亮显示:

x <- c("apple", "banana", "pear")
str_view(x, "an")

7[96(G_L4P1IVS7LW{46_BC.png

另一个更复杂一些的模式是使用 .,它可以匹配任意字符(除了换行符):

str_view(x, ".a.")

image.gif2]{UOW6$QN@[90P%FXYUNLS.png


锚点

  • ^ 从字符串开头进行匹配。
  • $ 从字符串末尾进行匹配。
x <- c("apple", "banana", "pear")
str_view(x, "^a")

image.gif@E5~$1`CDB0YU0}MU~ED)WM.png

str_view(x, "a$")

X]8$11SNE1KXQ`1{A`IN%_P.png


字符类与字符选项

很多特殊模式可以匹配多个字符:

  • .:匹配除换行符外的任意字符
  • \d:匹配任意数字
  • \s:匹配任意空白字符(如空格、制表符和换行符)
  • [abc]:可以匹配 a、b 或 c
  • [^abc]:可以匹配除 a、b、c 外的任意字符

注意:要想创建包含 \d 或 \s 的正则表达式,你需要在字符串中对 \ 进行转义,因此需 要输入 "\d" 或 "\s"。


重复

正则表达式的另一项强大功能是,其可以控制一个模式的匹配次数。

  • ?:0 次或 1 次。
  • +:1 次或多次。
  • *:0 次或多次。
x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"
str_view(x, "CC?")

image.gif1~SRBCUF7`X9D1[6Z1X`LKL.png

str_view(x, "CC+")

image.gifOZ_@]COY293Z)}~(Q1CJ3VE.png

str_view(x, 'C[LX]+')

image.gif还可以精确设置匹配的次数:

  • {n}:匹配 n 次
  • {n , }:匹配 n 次或更多次
  • {, m}:最多匹配 m 次
  • {n, m}:匹配 n 到 m 次
str_view(x, "C{2}")

2KB)E@Y}5LVD}E0@77Y29ZN.png

str_view(x, "C{2,}")

O_O4]2{HGE~J2JIZ%I$59TB.png

str_view(x, "C{2,3}")

O_O4]2{HGE~J2JIZ%I$59TB.png


分组与回溯引用

以下的正则表达式可以找出名称中有重复的一对字母的所有水果:

str_view(fruit, "(.)\\1", match = TRUE)

image.gifZ(KY@PCS~PSI5E~{HR}77B4.png

  • .:匹配任意字符
  • (.):将匹配项括起来,并将其命名为\\1;如果有两个括号,就命名为\\1\\2
  • \\1:表示回溯引用 因此,(.)\\1的意思是,匹配到了字符,后面还希望有个相同的字符。如果想要匹配abab类型:
str_view(fruit, "(..)\\1", match = TRUE)

如果想要匹配abba类型:

str_view(fruit, "(.)(.)\\2\\1", match = TRUE)


匹配检测

要想确定一个字符向量能否匹配一种模式,可以使用str_detect()函数。

x <- c("apple", "banana", "pear")
str_detect(x, "e")
#> [1] TRUE FALSE TRUE

str_detect() 函数的一种变体是str_count(),后者不是简单地返回是或否,而是返回字符串中匹配的数量:

x <- c("apple", "banana", "pear")
str_count(x, "a")
#> [1] 1 3 1
# 平均来看,每个单词中有多少个元音字母?
mean(str_count(words, "[aeiou]"))
#> [1] 1.99


提取匹配内容

要想提取匹配的实际文本,我们可以使用str_extract()函数。我们将使用维基百科上的 Harvard sentences数据集:

length(sentences)
#> [1] 720
head(sentences)
#> [1] "The birch canoe slid on the smooth planks."
#> [2] "Glue the sheet to the dark blue background."
#> [3] "It's easy to tell the depth of a well."
#> [4] "These days a chicken leg is a rare dish."
#> [5] "Rice is often served in round bowls."
#> [6] "The juice of lemons makes fine punch."

假设我们想要找出包含一种颜色的所有句子。首先,我们需要创建一个颜色名称向量,然后将其转换成一个正则表达式:

colors <- c(
"red", "orange", "yellow", "green", "blue", "purple"
)
color_match <- str_c(colors, collapse = "|")
color_match
#> [1] "red|orange|yellow|green|blue|purple"

现在我们可以选取出包含一种颜色的句子,再从中提取出颜色,就可以知道有哪些颜色了:

has_color <- str_subset(sentences, color_match)
matches <- str_extract(has_color, color_match)
head(matches)
#> [1] "blue" "blue" "red" "red" "red" "blue"


分组匹配

str_match()函数则可以给出每个独立分组。它返回的不是字符向量,而是一个矩阵,其中一列是完整匹配,后面的列是每个分组的匹配:

noun <- "(a|the) ([^ ]+)"
has_noun <- sentences %>%
str_subset(noun) %>%
head(10)
has_noun %>%
str_match(noun)
#> [,1] [,2] [,3]
#> [1,] "the smooth" "the" "smooth"
#> [2,] "the sheet" "the" "sheet"
#> [3,] "the depth" "the" "depth"
#> [4,] "a chicken" "a" "chicken"
#> [5,] "the parked" "the" "parked"
#> [6,] "the sun" "the" "sun"
#> [7,] "the huge" "the" "huge"
#> [8,] "the ball" "the" "ball"
#> [9,] "the woman" "the" "woman"
#> [10,] "a helps" "a" "helps"


替换匹配内容

str_replace()函数可以使用新字符串替换匹配内容。

x <- c("apple", "pear", "banana")
str_replace(x, "[aeiou]", "-")
#> [1] "-pple" "p-ar" "b-nana"
str_replace_all(x, "[aeiou]", "-")
#> [1] "-ppl-" "p--r" "b-n-n-"

通过提供一个命名向量,使用str_replace_all()函数可以同时执行多个替换:

x <- c("1 house", "2 cars", "3 people")
str_replace_all(x, c("1" = "one", "2" = "two", "3" = "three"))
#> [1] "one house" "two cars" "three people"

除了使用固定字符串替换匹配内容,你还可以使用回溯引用来插入匹配中的分组。在下面的代码中,我们交换了第二个单词和第三个单词的顺序:

sentences %>%
str_replace("([^ ]+) ([^ ]+) ([^ ]+)", "\\1 \\3 \\2") %>%
head(5)
#> [1] "The canoe birch slid on the smooth planks."
#> [2] "Glue sheet the to the dark blue background."
#> [3] "It's to easy tell the depth of a well."
#> [4] "These a days chicken leg is a rare dish."
#> [5] "Rice often is served in round bowls."


拆分

str_split()函数可以将字符串拆分为多个片段。例如,我们可以将句子拆分成单词:

sentences %>%
head(5) %>%
str_split(" ")
#> [[1]]
#> [1] "The" "birch" "canoe" "slid" "on" "the"
#> [7] "smooth" "planks."
#>
#> [[2]]
#> [1] "Glue" "the" "sheet" "to"
#> [5] "the" "dark" "blue" "background."
#>
#> [[3]]
#> [1] "It's" "easy" "to" "tell" "the" "depth" "of"
#> [8] "a" "well."
#>
#> [[4]]
#> [1] "These" "days" "a" "chicken" "leg" "is"
#> [7] "a" "rare" "dish."
#>
#> [[5]]
#> [1] "Rice" "is" "often" "served" "in" "round"


定位匹配内容

str_locate()函数可以给出每个匹配的开始位置和结束位置。

x <- c("apple", "banana", "pear")
str_locate(x,"a")
     start end
[1,]     1   1
[2,]     2   2
[3,]     3   3


目录
相关文章
|
算法 安全 搜索推荐
TLS 协议-对称加密原理
TLS 协议-对称加密原理
646 0
|
算法 安全 数据挖掘
如何更轻松地学习差分隐私——《动手学差分隐私》中文版正式发布!
2022年10月28日,阿里巴巴集团数据技术及产品部DataTrust团队成员刘巍然、李双为差分隐私在线书籍《动手学差分隐私(Programming Differential Privacy )》提供的中文翻译版本正式被原著作者Joseph P. Near和Chiké Abuah合并到书籍GitHub仓库(https://github.com/uvm-plaid/programming-dp/)中
2627 0
如何更轻松地学习差分隐私——《动手学差分隐私》中文版正式发布!
|
JavaScript 前端开发
原型与原型链,数形结合搞懂原型与原型链,真正理解原型链,面试官直呼内行。
原型与原型链,数形结合搞懂原型与原型链,真正理解原型链,面试官直呼内行。
302 0
|
新零售 机器学习/深度学习 人工智能
云栖新闻|助力企业智能化升级 达摩院“新一代企业智能服务论坛”圆满举行
介绍阿里云智能客服最新进展,包括全渠道全场景覆盖的云上产品矩阵,从智能服务向智能营销场景延申的解决方案,国内首创的智能策略中心的发布,号召客户和生态伙伴与我们圆桌探讨智能服务行业未来。
云栖新闻|助力企业智能化升级 达摩院“新一代企业智能服务论坛”圆满举行
|
JavaScript 前端开发
js解析上传APK文件的详细信息
js解析上传APK文件的详细信息
|
数据采集 监控 数据可视化
数据驱动营销五步法:提升营销效果的关键指南
数据驱动营销五步法:提升营销效果的关键指南
486 17
|
自然语言处理 搜索推荐 机器人
自然语言处理(NLP)技术的应用场景深度解析
【7月更文挑战第28天】自然语言处理(NLP)技术以其广泛的应用场景和卓越的性能在人工智能领域占据重要地位。从搜索引擎优化到机器翻译,从情感分析到聊天机器人,NLP技术正在不断地改变着我们的工作和生活方式。随着技术的不断进步和应用领域的不断拓展,我们有理由相信NLP将在未来的人工智能领域中发挥更加重要的作用,为人类社会带来更多的便利和创新。
1113 1
|
安全 网络安全 量子技术
探索未来网络安全的关键:量子加密技术
本文深入探讨了量子加密技术,一项被视为未来网络安全领域的重要突破。通过详细分析量子加密的工作原理、优势以及当前面临的挑战和潜在解决方案,文章为读者提供了对这一前沿技术的全面理解。我们将探讨如何将量子加密技术与现有网络安全架构融合,以及它在未来数字世界中的潜在应用。
718 2
|
缓存 数据挖掘 大数据
阿里云服务器通用算力型u1与经济型e实例详细对比与选择参考
在阿里云丰富的云服务器实例规格中,通用算力型u1和经济型e实例的云服务器相对于其他实例规格来说,活动价格相对更低的两个云服务器实例,由于经济型e实例是共享型实例规格,而通用算力型u1实例是独享型实例规格,因此,有的用户比较关心阿里云通用算力型u1云服务器怎么样?本文将为您介绍这两款云服务器的区别、性能特点、适用场景及价格对比,为用户的选购决策提供全面参考。
阿里云服务器通用算力型u1与经济型e实例详细对比与选择参考