如何在R中用正则表达式提取字符串中所有连续4字符子串
问题背景
需要从字符串中提取所有符合规则的连续4字符子串,示例如下:
- 输入字符串:
ghijklm - 期望返回结果:
'ghij'、'hijk'、'ijkl'、'jklm'
现有运行代码仅能返回第一个匹配到的4字符子串:
library(stringr) library(dplyr) text1 <- 'ghijklm' text1 %>% stringr::str_match('\\w{4}') # 返回结果 # [,1] # [1,] "ghij"
调整方案
你当前只拿到单个结果是因为str_match默认仅返回第一次匹配结果,且普通正则匹配会消耗已匹配的字符,无法实现滑动取连续子串的效果。可以使用正向零宽断言配合全匹配函数解决:
text1 %>% # (?=(\\w{4})) 为正向零宽先行断言,匹配时不消耗字符,可逐个位置向后滑动识别4字符子串 stringr::str_match_all('(?=(\\w{4}))') %>% # 提取匹配结果中的目标子串维度 .[[1]] %>% .[,2]
运行后即可得到预期结果:"ghij" "hijk" "ijkl" "jklm"
如果不想使用正则,也可以用滑动窗口函数实现:
library(zoo) text1 %>% # 拆分字符串为单个字符向量 strsplit("") %>% .[[1]] %>% # 窗口宽度设为4,滑动拼接字符 rollapply(width = 4, FUN = paste, collapse = "")
内容的提问来源于stack exchange,提问作者Masoud
相关产品推荐
相关产品推荐

