在R语言中如何启用正则表达式的u(Unicode)标志?
在R中启用正则表达式的Unicode(u)标志
问题描述
我需要移除字符串中的空格,以及非词首或数字开头的Unicode单词字符,对应的正则表达式为\B\w+| +,该表达式需配合Unicode(u)标志使用。但R中的内联修饰符(?u)无效,想了解R中是否有其他方式设置Unicode选项,不寻求用Unicode类别实现等效正则,仅关注在R中使用u选项的可行性。
附示例代码:
s <- c("89 562", "John Smith", "Γιάννης Παπαδόπουλος", "Jean-François Dupuis") gsub("\\B\\w+| +", "", s, perl = TRUE) #> [1] "85" "JS" "ΓιάννηςΠαπαδόπουλος" #> [4] "J-FçoD"
预期输出:
"85", "JS", "ΓΠ", "J-FD"
解答
在R中,基础gsub(即使启用perl=TRUE)并不支持直接开启Unicode(u)标志来让\w匹配所有Unicode单词字符,但可以通过两种间接方式实现等效效果:
- 使用
stringr包的函数stringr基于ICU正则引擎,默认支持Unicode特性。直接使用str_replace_all即可让正则表达式正确识别Unicode单词字符:
library(stringr) s <- c("89 562", "John Smith", "Γιάννης Παπαδόπουλος", "Jean-François Dupuis") str_replace_all(s, "\\B\\w+| +", "") #> [1] "85" "JS" "ΓΠ" "J-FD"
这里\w会自动匹配希腊字母等Unicode单词字符,\B也能正确识别词边界,最终得到预期结果。
- 给基础R的PCRE引擎添加指令
基础R启用perl=TRUE后使用PCRE引擎,可在正则开头添加(*UTF)和(*UCP)指令,让\w等元字符支持Unicode:
s <- c("89 562", "John Smith", "Γιάννης Παπαδόπουλος", "Jean-François Dupuis") gsub("(*UTF)(*UCP)\\B\\w+| +", "", s, perl = TRUE) #> [1] "85" "JS" "ΓΠ" "J-FD"
(*UTF)指定按UTF-8处理字符串,(*UCP)让元字符使用Unicode属性类,实现和u标志一致的匹配逻辑。
需要说明的是,R中没有直接对应u标志的参数或修饰符,但上述两种方法可满足你对Unicode正则匹配的需求。
内容的提问来源于stack exchange,提问作者Junitar
相关产品推荐
相关产品推荐

