regex 如何str_detect一个包含括号的字符串?

umuewwlo  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(129)

我尝试对一列中的多个字符串进行字符串搜索,但脚本不返回带括号的字符串。

a <-  c("Apple", "Facebook", "Google (1992)")
b <- c(1, 2, 3)

c <-  data.frame(a, b)

d <- c %>% 
  distinct(a) %>% 
  pull()

c %>% 
  filter(str_detect(a, paste(d, collapse = "|"))) %>% 
  group_by(a) %>% 
  tally()

我希望最后一个脚本返回“Apple”,“Facebook”,“Google(1992)",但它只返回前两个。我可以在“collapse”参数中添加一些东西来包含带括号的字符串吗?

falq053o

falq053o1#

(Per注解,在这种情况下甚至不需要正则表达式。但为了将来的参考:)正如您可能已经知道的那样,在正则表达式中必须对括号进行转义。当您直接指定模式时,这很容易-例如,str_detect(a, "Google \\(1992\\)")。但是当模式存储在变量中时,就像在您的情况下一样,它可能稍微有点棘手。您可以将其处理为

library(stringr)

str_detect(a, paste(
  str_replace_all(d, c("\\(" = "\\\\(", "\\)" = "\\\\)")), 
  collapse = "|"
))

在替换向量中,我们必须转义左边的括号("\\(")。但是在右边,我们必须转义"\"--我们使用"\\\\"插入文字"\\"

b4wnujal

b4wnujal2#

我们可以在str_detect中使用fixed,方法是循环模式并将其减少为单个逻辑向量

library(dplyr)
library(stringr)
library(purrr)
c %>% 
  filter(map(d, ~ str_detect(a, fixed(.x))) %>% reduce(`|`))
              a b
1         Apple 1
2      Facebook 2
3 Google (1992) 3

相关问题