【问题标题】:Finding out which pattern was matched when using multiple patterns在使用多个模式时找出匹配的模式
【发布时间】:2019-06-09 20:48:03
【问题描述】:

我正在寻找文件名列表中匹配的模式。我可以找出是否找到匹配项,但不知道匹配的模式。

  local_pattern <- data.frame(
    condition = c("umhfl","dmhfl", "umhfr", "dmhfr", "shfr", "vshfr", "vshfl"),
    filename = c("*Upward motion*HF*Left*.csv", "*Downward motion*HF*Left*.csv", "*UHFR*.csv", "*DHFR*.csv", "*SHFR*.csv", "*VSHFR*.csv", "*VSHFL*.csv")
  )

## matching a sample file name
pattern_matched <- grep(paste(glob2rx(local_pattern[,2]), collapse = "|"), "./csv files/DHFR 2019-04-09 04.59 PM_001.csv", value = F)

我希望看到的是匹配的模式,而不是简单地找到匹配项的 TRUE。

【问题讨论】:

  • 为什么不把value=F改成value=TRUE
  • 这仍然不能告诉我在特定文件名中找到了哪种模式。
  • 你已经看过这里了吗stackoverflow.com/questions/9537797/…
  • 确实,那里的第一个答案可能重复 - stackoverflow.com/a/9538033/496803 - 它为每种可能性返回一个 TRUE/FALSE 矩阵。
  • @Sven,类似但不一样。匹配模式在这里有通配符,但解决方案在这里不起作用。

标签: r


【解决方案1】:

我们可以使用stringr 中的str_detect,它在stringpattern 上进行了矢量化处理:

library(stringr)
str_detect("./csv files/DHFR 2019-04-09 04.59 PM_001.csv",
           glob2rx(local_pattern[, 2]))
# [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

这样

local_pattern[str_detect("./csv files/DHFR 2019-04-09 04.59 PM_001.csv", glob2rx(local_pattern[,2])), 2]
# [1] *DHFR*.csv

【讨论】:

  • 我如何知道 DHFR 模式是匹配的,而不是其他模式之一?
  • 这很好用,谢谢!简洁并输出正确的代码。我所做的唯一修改是从 local_pattern 输出第 1 列。
【解决方案2】:

如果要匹配的模式少于 10 个,您可以使用 base R 中的PERL 样式捕获来收集信息。首先使用(...) 构建一个模式以进行捕获。

pat <- paste(glob2rx(local_pattern$filename), collapse = ")|(")
pat <- paste0("(", pat, ")")

现在将文本字符串分配给变量:

x <- "./csv files/DHFR 2019-04-09 04.59 PM_001.csv"

使用regexpr 或更努力地使用gregexpr 进行多个匹配:

m <- regexpr(pat, x, perl = TRUE)
sel <- which(attr(m, "capture.length") > 0)

收集所需信息:

local_pattern[sel,]
>   condition   filename
> 4     dmhfr *DHFR*.csv

regmatches(x, m)
> [1] "./csv files/DHFR 2019-04-09 04.59 PM_001.csv"

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2020-12-30
    • 2011-10-20
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多