R:通过正则表达式提取字符串匹配部分的列表

时间:2015-01-13 12:25:01

标签: regex r string substring string-matching

假设我需要从字符串中提取不同的部分作为列表,例如我想将字符串"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循环内)。是不是只有从正则表达式和测试字符串返回部件列表的函数?

2 个答案:

答案 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)。请参阅演示。

https://regex101.com/r/fA6wE2/8