【问题标题】:How to search for strings with parentheses in R如何在R中搜索带括号的字符串
【发布时间】:2019-05-16 18:43:14
【问题描述】:

使用 R,我有一长串要在数据集中搜索的关键字。其中一个关键字需要用括号括起来才能被包含在内。

我一直在尝试将关键字列表中的括号替换为\\,然后是括号,但没有成功。如果有办法修改grepl() 函数以识别它们,那也会有所帮助。这是我正在尝试完成的示例:

patterns<-c("dog","cat","(fish)")

data<-c("brown dog","black bear","salmon (fish)","red fish")

patterns2<- paste(patterns,collapse="|")

grepl(patterns2,data)

[1]  TRUE FALSE  TRUE  TRUE

我想salmon (fish)TRUEred fishFALSE

谢谢!

【问题讨论】:

  • 您需要 patterns&lt;-c("dog","cat","\\(fish\\)") 来表示括号。
  • 是的,有没有办法将“模式”字符串中的所有括号替换为斜杠前面?我有一长串关键字,想一次性为带括号的关键字做这些。
  • patterns &lt;- gsub("\\(", "\\\\(", patterns); patterns &lt;- gsub("\\)", "\\\\)", patterns);
  • 或者,一口气:gsub("([()])","\\\\\\1", patterns) -> [1] "dog" "cat" "\\(fish\\)"
  • 此时,我们中的一个人应该写一个答案。我提名@iod。最巧妙的解决方案 + 你需要声誉 ;)

标签: r string parentheses grepl


【解决方案1】:

正如@joran 在 cmets 中所指出的,该模式应如下所示:

patterns<-c("dog","cat","\\(fish\\)")

\\s 将告诉 R 在搜索模式时按字面意思阅读括号。

如果您不想手动进行更改,最简单的方法是:

patterns <- gsub("([()])","\\\\\\1", patterns)

这将导致:

[1] "dog" "cat" "\\(fish\\)"

如果您对正则表达式不是很熟悉,这里发生的情况是它会在方括号内查找任何一个字符。它周围的圆括号告诉它保存找到的与内容匹配的任何内容。然后,第二个参数中的前四个斜杠告诉它用两个斜杠替换找到的内容(每个两个斜杠转换为一个斜杠),\\1 告诉它添加从第一个参数保存的任何内容 - 即,要么()

【讨论】:

  • 无耻插入fortunes::fortune(365)的好答案。
  • 有趣,这正是我找到解决方案的方式!
【解决方案2】:

另一种选择是忘记正则表达式并使用greplfixed = T

rowSums(sapply(patterns, grepl, data, fixed = T)) > 0
# [1]  TRUE FALSE  TRUE FALSE

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多