如何在R中将Web of Science高级检索查询转换为正则表达式
WoS高级检索语句自动转正则表达式的方法
有可直接落地的实现方案,核心思路是通过语法映射规则,把WoS检索逻辑对应到正则语法,也可以直接封装为函数实现批量自动转换。
核心转换规则
- 先剥离字段限定前缀(如示例中的
TI =),仅处理后续括号内的检索逻辑部分 - 检索词的双引号直接保留(如需匹配精确短语),如果检索词包含正则特殊字符(
.、*、+、?等),需先做转义处理避免正则解析错误 - 逻辑运算符
OR直接替换为正则中的或运算符|,需注意将OR连接的一组内容放在括号内保证优先级正确 - 逻辑运算符
AND替换为正则的正向肯定预查结构(?=.*检索内容),所有AND连接的预查结构拼接后,前后补充^和.*$即可实现同时命中所有检索条件的效果
示例转换效果
你给出的WoS检索语句:
TI = ("ecology" AND ("climate change" OR "biodiversity"))
按上述规则转换后得到的正则表达式为:
^(?=.*ecology)(?=.*(climate change|biodiversity)).*$
转换后可直接在R的str_detect中使用,和你给出的多条件&连接的写法效果完全一致:
# 两种写法效果完全相同 str_detect(TI,"ecology") & str_detect(TI,"climate change|biodiversity") str_detect(TI, "^(?=.*ecology)(?=.*(climate change|biodiversity)).*$")
简易R实现函数
你可以直接使用下面的封装函数实现基础的WoS语句到正则的自动转换:
library(stringr) wos_to_regex <- function(wos_query) { # 剥离字段限定前缀 logic_part <- sub("^[A-Z]+\\s*=\\s*", "", wos_query) # 转义正则特殊字符 logic_part <- str_replace_all(logic_part, "([\\.\\*\\+\\?\\|\\{\\}\\(\\)\\[\\]\\\\\\^\\$])", "\\\\\\1") # 替换OR运算符为| logic_part <- str_replace_all(logic_part, "\\s+OR\\s+", "|") # 拆分所有AND连接的检索项 and_items <- str_split(logic_part, "\\s+AND\\s+")[[1]] # 转换为正向预查结构 pre_checks <- paste0("(?=.*", and_items, ")", collapse = "") # 拼接完整正则,去除多余的双引号 full_regex <- str_replace_all(paste0("^", pre_checks, ".*$"), '\\"', "") return(full_regex) } # 调用测试 wos_query <- 'TI = ("ecology" AND ("climate change" OR "biodiversity"))' wos_to_regex(wos_query) # 输出:^(?=.*ecology)(?=.*(climate change|biodiversity)).*$
扩展说明
如果需要支持WoS更复杂的检索语法,只需要补充对应的映射规则即可:
- 通配符
*可映射为正则的.*,?映射为正则的.{1} - 邻近运算符
NEAR/n可映射为\\s+(?:\\w+\\s+){0,n},实现两个检索词间隔不超过n个词的效果 - 同字段运算符
SAME可根据需求调整为对应字段内的匹配逻辑即可
内容的提问来源于stack exchange,提问作者Hope
相关产品推荐
相关产品推荐

