9  字符串处理(stringr包)

library(stringr)
A = c("A_A", "A_1.txt", "B_B", "B_123.txt")

9.1 基础用法

字符串长度

str_length(A)
[1] 3 7 3 9

字符串截断

str_trunc(A,5)
[1] "A_A"   "A_..." "B_B"   "B_..."

字符串填充

str_pad(A,5,side="right",pad=" ")
[1] "A_A  "     "A_1.txt"   "B_B  "     "B_123.txt"

字符串合并

# 简单合并
str_c(A,"_hello")
[1] "A_A_hello"       "A_1.txt_hello"   "B_B_hello"       "B_123.txt_hello"
# 指定连接符
str_c(A,"_hello",
      sep = "-",        # 连接符 
      collapse = "|"  # 把字符向量合并成一个字符串的连接符
      ) 
[1] "A_A-_hello|A_1.txt-_hello|B_B-_hello|B_123.txt-_hello"

字符串拆分

str_split(A,pattern = "_")
[[1]]
[1] "A" "A"

[[2]]
[1] "A"     "1.txt"

[[3]]
[1] "B" "B"

[[4]]
[1] "B"       "123.txt"

9.2 字符串匹配

  • str_sub() # 用于提取置字符串某个位置区间的子串

  • str_detect() # 用于检测字符串是否匹配到

  • str_subset() # 筛选出匹配的字符串

  • str_locate()# 用于定位字符串中匹配到的起始和结束位置。/_all

  • str_extract() # 提取匹配到的子串 /_all

  • str_remove() # 移除匹配到的子串 /_all

  • str_replace() # 替换匹配到的子串 /_all

9.2.1 正则表达式

正则表达式是一种强大的文本处理规则,允许我们编写复杂的规则来匹配到想要的字符串。

  • ^:匹配行的开头。

  • $:匹配行的结尾。

  • *:匹配前面的元素零次或多次。 A*

  • +:匹配前面的元素一次或多次。

  • ?:开启非贪婪模式。

  • |:匹配左右任意一个表达式。

  • {}:指定前面元素出现的次数。

  • []:匹配方括号内的任意一个字符。

  • .:匹配任意字符。

  • \\d:匹配任何数字字符(等价于 [0-9])。

  • \\D:匹配任何非数字字符。

  • \\s:匹配任何空白字符(如空格、制表符)。\\S大写的S表示非空白字符

  • \\w:匹配字母文本(字母数字下划线中文)字符。\\W大写的W表示非文本字符

9.2.2 匹配函数

str_sub用于提取置字符串某个位置区间的子串

# 取出第2到第3位置的子字符串
str_sub(A,start = 2,end = 3)
[1] "_A" "_1" "_B" "_1"

str_detect用于检测字符串是否匹配到

# 检测末尾是否是".txt",是的话返回TRUE
str_detect(A,pattern = "\\.txt$")
[1] FALSE  TRUE FALSE  TRUE

str_subset筛选出匹配的字符串

# 检测是否含有数字,是的话返回整个字符串
str_subset(A,pattern = "\\d")
[1] "A_1.txt"   "B_123.txt"
  • str_locate用于定位字符串中匹配到的起始和结束位置。
str_locate_all(A,"txt")
[[1]]
     start end

[[2]]
     start end
[1,]     5   7

[[3]]
     start end

[[4]]
     start end
[1,]     7   9

str_extract提取匹配到的子串 /_all

# 提取字符串中的数字
str_extract_all(A,"\\d+")
[[1]]
character(0)

[[2]]
[1] "1"

[[3]]
character(0)

[[4]]
[1] "123"

str_remove移除匹配到的子串 /_all\

# 移除下划线及之后的任意字符
str_remove_all(A,"_.+")
[1] "A" "A" "B" "B"

str_replace替换匹配到的子串 /_all

# 将下划线替换成中划线
str_replace_all(A,"_","-")
[1] "A-A"       "A-1.txt"   "B-B"       "B-123.txt"

9.2.3 零宽断言

匹配两个标识符之间的字符串。

(?<=字符)  # 左边的标识符

(?=字符)   # 右边的标识符
# 取出下划线和".txt"之间的字符
str_extract("B_123.txt",pattern = "(?<=_).+(?=.txt)")
[1] "123"

9.3 其他

base R 中的用法

nchr() :返回字符串的长度。同str_length

paste():拼接字符串。同str_c