搜索特定的字符串模式

时间:2019-02-06 03:28:53

标签: r regex string

我希望能够搜索具有以下格式的特定字符串:

"q4-2015"
"q2-2013"
"q3-2011"

从一长串文件名中将它们分解为两个变量: 季度和年度。

例如,一长串名称可以包括:

"aaaaa-ttttt-eeee-q4-2015-file"
"aaaaaa-fffff-3333-q2-2012-file"

,并且代码应循环遍历文件名,然后在第一种情况下抛出特定的变量

year = 2015, quarter = q4

第二种情况:

year = 2012, quarter = q2

3 个答案:

答案 0 :(得分:3)

我们可以在此处尝试使用sub

quarters <- sapply(input, function(x) {
    sub(".*\\b(q\\d+)-\\d{4}\\b.*", "\\1", x)
})

years <- sapply(input, function(x) {
    sub(".*\\bq\\d+-(\\d{4})\\b.*", "\\1", x)
})

df <- data.frame(quarters, years)
df

        quarters years
q4-2015       q4  2015
q2-2013       q2  2013
q3-2011       q3  2011

答案 1 :(得分:1)

我们可以尝试这种模式

captured_words <- sub(".*\\b(q\\d)-(\\d+)\\b.*", "\\1-\\2", x)
captured_words
#[1] "q4-2015" "q2-2012"

在这里,我们捕获两个术语:

1)q后跟一个数字,然后是2)其后的数字。

我们可以将它们分开,并使用read.table

在数据框中读取它们
read.table(text = paste0(captured_words, collapse = "\n"), sep = "-")

#  V1   V2
#1 q4 2015
#2 q2 2012

数据

x <- c("aaaaa-ttttt-eeee-q4-2015-file","aaaaaa-fffff-3333-q2-2012-file")

答案 2 :(得分:0)

1)捕获使用注释末尾可重复显示的测试输入,可以从基数R调用strcapture

pat <- "(q\\d)-(\\d{4})"
strcapture(pat, x, list(quarter = "", year = 0))

给予:

  quarter year
1      q4 2015
2      q2 2012

另一种选择是使用数字四分之一列。在这种情况下,我们将使用pat <- "(\\d)-(\\d{4})"list(quarter = 0, year = 0)

2)gsubfn软件包中的read.pattern read.pattern可以使用相同的模式。

library(gsubfn)

read.pattern(text = x, pattern = pat, col.names = c("quarter", "year"),
  as.is = TRUE)

给予:

  quarter year
1      q4 2015
2      q2 2012

2a)另一种方法是使用gsubfn的strapply生成yearqtr类对象,然后我们可以很容易地提取季度和年份,也可以将其保留为Yearmon对象:

library(gsubfn)
library(zoo)

ym  <- do.call("c", 
  strapply(x, pat, q + y ~ as.yearqtr(paste(y, q, sep = "-"))))

ym
## [1] "2015 Q4" "2012 Q2"

data.frame(quarter = paste0("q", cycle(ym), year = as.integer(ym),
  stringsAsFactors = FALSE)
##   quarter year
## 1      q4 2015
## 2      q2 2012

注意

# test input
x <- c("aaaaa-ttttt-eeee-q4-2015-file",
  "aaaaaa-fffff-3333-q2-2012-file")