在 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)"
我有一列,其中的值以分号 (;) 分隔。例如,列中的值可以是:
我不会总是将相同数量的元素分开。
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)"