在R中实现不区分重音的正则匹配问题求助
解决重音+大小写不敏感匹配的几种方法
方法1:用stringi包(推荐,简洁高效)
stringi包的stri_detect()函数支持通过排序规则忽略重音和大小写,设置strength=1就能实现"基本等价"匹配——自动忽略大小写、重音及变音符号,不用手动替换字符。
library(stringi) library(dplyr) cobras <- final %>% filter(stri_detect(NAME, regex = "guartelá", case_insensitive = TRUE, strength = 1) | stri_detect(locality, regex = "guartelá", case_insensitive = TRUE, strength = 1))
嫌重复代码麻烦的话,还可以把匹配逻辑抽成函数:
match_guartela <- function(x) stri_detect(x, regex = "guartelá", case_insensitive = TRUE, strength = 1) cobras <- final %>% filter(match_guartela(NAME) | match_guartela(locality))
方法2:Base R 手动去重音后匹配
用iconv()把带重音的字符转成无重音版本,再做大小写不敏感匹配,纯Base R就能实现:
# 定义去重音函数 remove_accents <- function(x) { iconv(x, from = "UTF-8", to = "ASCII//TRANSLIT") } # 转换后匹配 cobras <- final %>% filter(grepl("guartela", remove_accents(NAME), ignore.case = TRUE) | grepl("guartela", remove_accents(locality), ignore.case = TRUE))
注:iconv的转换效果可能受系统环境影响,但绝大多数场景下都能正常处理常见重音字符。
方法3:tidyverse + stringr 针对性替换重音
如果只需要处理特定重音(比如这里的á),可以用stringr的替换函数直接把重音字符换成普通字符,再匹配:
library(stringr) library(dplyr) cobras <- final %>% filter(str_detect(str_replace_all(NAME, "á", "a"), regex("guartela", ignore_case = TRUE)) | str_detect(str_replace_all(locality, "á", "a"), regex("guartela", ignore_case = TRUE)))
要是需要处理更多重音变体,比如àâã,可以把正则改成str_replace_all(x, "[áàâã]", "a")。
内容的提问来源于stack exchange,提问作者hiperhiper
相关产品推荐
相关产品推荐

