在r中的字符串中查找多个单词
Posted
技术标签:
【中文标题】在r中的字符串中查找多个单词【英文标题】:Find several words in a string in r 【发布时间】:2021-06-23 15:32:01 【问题描述】:我有一列,其中的值用分号 (;) 分隔。例如,列中的值可能是:
我不会总是将相同数量的元素分开。
string1="abacavir sulfate; lamivudine; zidovudine"
string2="omeprazole magnesium; amoxicillin ; rifabutin"
string3="acetyl chloride; calcium"
我需要将它们放入一个正则表达式中,这样我才能看到我的其他数据框中的哪些字符串包含所有单词:
string_1_regex="^(?=.*\\babacavir sulfate\\b)(?=.*\\blamivudine\\b)(?=.*\\bzidovudine\\b)"
string_2_regex="^(?=.*\\bomeprazole magnesium\\b)(?=.*\\bamoxicillin\\b)(?=.*\\brifabutin\\b)"
string_3_regex="^(?=.*\\bacetyl chloride\\b)(?=.*\\bcalcium\\b)"
【问题讨论】:
您的问题是什么?您是否在寻找广义函数? 根据您的数据量,正则表达式可能会很慢。您最好将每个单词分离成一个向量/列表(计算成本低),然后在数据集之间进行连接。如果您的解决方案对您来说运行得足够快,请忽略此评论。 【参考方案1】:我猜您正在寻找一种能够以通用方式实现此目的的函数。
这是我定义这样一个函数的方法:
library(magrittr)
regexify <- \(s) strsplit(s, ";") %>%
unlist() %>%
trimws() %>%
sprintf("(?=.*\\%s\\b)", .) %>%
c("^", .) %>%
paste(collapse = "")
你可以这样做
Map(regexify, list(string1,
string2,
string2))
返回
[[1]]
[1] "^(?=.*\\abacavir sulfate\\b)(?=.*\\lamivudine\\b)(?=.*\\zidovudine\\b)"
[[2]]
[1] "^(?=.*\\omeprazole magnesium\\b)(?=.*\\amoxicillin\\b)(?=.*\\rifabutin\\b)"
[[3]]
[1] "^(?=.*\\omeprazole magnesium\\b)(?=.*\\amoxicillin\\b)(?=.*\\rifabutin\\b)"
【讨论】:
【参考方案2】:str_replace
的选项
library(stringr)
str_c("^", str_remove_all(str_replace_all(str_remove_all(c(string1,
string2, string3), "(?<=;)\\s*|\\s*(?=;)"),
"\\s*(?<=^|;)\\s*([^;]+)", function(x) sprintf("(?=.*\\%s\\b)", x)), ";"))
-输出
[1] "^(?=.*\\abacavir sulfate\\b)(?=.*\\lamivudine\\b)(?=.*\\zidovudine\\b)"
[2] "^(?=.*\\omeprazole magnesium\\b)(?=.*\\amoxicillin\\b)(?=.*\\rifabutin\\b)"
[3] "^(?=.*\\acetyl chloride\\b)(?=.*\\calcium\\b)"
【讨论】:
以上是关于在r中的字符串中查找多个单词的主要内容,如果未能解决你的问题,请参考以下文章
编写程序,输入字符串(包含空格),统计其中单词的个数,单词之间以一个或多个空格分隔。
在 R 中使用正则表达式来查找字符串作为整个单词(但不是字符串作为单词的一部分)