在 r 中的字符串中查找多个单词

Find several words in a string in r

我有一列,其中的值以分号 (;) 分隔。例如,列中的值可以是:

我不会总是将相同数量的元素分开。

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)"

我猜您正在寻找一个可以通用方式实现此目的的函数。

这是我定义这样一个函数的方法:

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)"

选项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)"