在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 中使用正则表达式来查找字符串作为整个单词(但不是字符串作为单词的一部分)

用jquery在字符串中查找最后一个单词的第一个字母(字符串可以有多个单词)

Excel - 查找和替换多个单词

在字符串中查找与字典中的值匹配的单词,然后在新列中返回键

在 C++ 中查找和比较 Unicode 字符