7.2.3 联合stringr包与正则表达式处理复杂字符串
stringr包中的模式匹配函数可对字符串进行检测、定位、提取、匹配、替换和拆分等操作,各个操作对应的模式匹配函数如下。
·检测:str_detect()函数
·提取:str_extract()和str_extract_all()函数
·匹配:str_match()和str_match_all()函数
·替换:str_replace()和str_replace_all()函数
·拆分:str_split()函数
这些模式匹配函数都能与正则表达式结合使用。本节将结合上述模式匹配函数和正则表达式来进一步学习如何对文本数据进行处理。
1.检测
str_detect()函数能够检测字符串中是否存在符合给定模式的子串,并返回一个逻辑向量,示例如下:
通过输出结果可以发现,前两个字符串不包含“ea”,后两个字符串包含“ea”。我们也可以通过str_detect()函数提取符合某种模式的字符串,示例如下:
2.提取
str_extract()函数提取第一个与给定模式匹配的字符,并返回一个字符向量,若未匹配成功,则返回NA。str_extract_all()函数提取所有与给定模式匹配的字符,默认返回字符向量列表,其中simplify参数控制是否返回字符矩阵,若为TRUE,则返回字符矩阵。示例如下:
3.匹配
str_match()函数提取字符串中与给定模式匹配的字符,并以矩阵的形式返回,若未匹配成功,则返回NA。示例如下:
当使用[a-z]进行匹配时,结果如下:
由输出结果可以发现,使用[a-z]匹配时,只匹配到了每个字符串的首字母,如果需要匹配尽可能多的字符,可以使用“*”或者“+”进行匹配,示例如下:
str_match_all()会依次匹配字符串中与给定模式匹配的字符,然后以矩阵的形式返回。示例如下:
4.替换
str_replace()和str_replace_all()函数可以用于数据的替换。在文本数据中,经常会出现一些没有意义,影响数据分析结果的符号,可以使用这两个函数对这些符号进行替换。这两个函数的区别在于,前者只会替换首次满足条件的子字符串,后者可以替换所有满足条件的子字符串。str_repalce()的使用示例如下:
其中,参数replacement是用于替换的字符;参数string指被替换的字符串;参数pattern指要替换的字符匹配模式,可以用正则表达式来表达匹配模式。
将字符串第一个出现的a或者b替换为空格,代码如下:
或者使用str_replace_all()将目标字符串的所有a和b替换为空格,代码如下:
5.拆分
str_split()函数可以对字符串进行拆分,示例如下:
在这个函数中,string参数是要处理的字符串对象;pattern是分隔符,也可以是复杂的正则表达式;n是指定切割的份数,默认所有符合条件的字符串都会被拆分开来;simplify是逻辑值,表示是否返回字符串矩阵,默认以列表的形式返回。例如: