假设我需要从字符串中提取不同的部分作为列表,例如我想将字符串"aaa12xxx"
分成三部分。
一种可能性是进行三次gsub
次呼叫:
parts = c()
parts[1] = gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\1', "aaa12xxx")
parts[2] = gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")
parts[3] = gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\3', "aaa12xxx")
当然这似乎很浪费(即使它在for
循环内)。是不是只有从正则表达式和测试字符串返回部件列表的函数?
答案 0 :(得分:4)
只需将输入字符串拆分为strsplit
,然后获取所需的部分..
> x <- "aaa12xxx"
> strsplit(x,"(?<=[[:alpha:]])(?=\\d)|(?<=\\d)(?=[[:alpha:]])", perl=TRUE)
[[1]]
[1] "aaa" "12" "xxx"
通过指定索引号来获取部件..
> m <- unlist(strsplit(x,"(?<=[[:alpha:]])(?=\\d)|(?<=\\d)(?=[[:alpha:]])", perl=TRUE))
> m[1]
[1] "aaa"
> m[2]
[1] "12"
> m[3]
[1] "xxx"
(?<=[[:alpha:]])(?=\\d)
匹配所有以字母开头且后跟数字的边界。
|
或
(?<=\\d)(?=[[:alpha:]])
匹配前面有数字并后跟字母的所有边界。
根据匹配的边界拆分输入将为您提供所需的输出。
答案 1 :(得分:3)
(\\d+)|([a-zA-Z]+)
或
([[:alpha:]]+)|([0-9]+)
您可以从str_match_all()
抓取capture.use library(stringr)
。请参阅演示。