R 3.6.1中grepl与stri_detect_regex正则匹配表现差异咨询
grepl与stri_detect_regex对\p{L}解析差异的原因说明
注:该问题仅出现于R 3.6.1版本,新版本中两函数表现已一致。
在R 3.6.1中,grepl(开启perl=T)与stri_detect_regex对正则表达式\p{L}的解析差异,根源在于二者依赖的正则引擎不同:
grepl(..., perl = T)基于PCRE(Perl兼容正则表达式)引擎,该版本的PCRE对Unicode字母属性\p{L}的覆盖范围有限,未将Latin Extended D/E这类较新的Unicode字符块中的字符归类为字母范畴。stri_detect_regex属于stringi包,依赖ICU(Unicode国际组件)引擎,ICU对Unicode标准的支持更全面,能完整识别所有Unicode官方定义的字母字符,包括Latin Extended D/E块中的字符。
结合测试代码:
v <- c("é", "Ḃ", "Ꞵ", "ꞵ", "Ꞷ", "ꞷ","keepme", "remove$me", "remove.me") v[grepl("^[\\p{L} ]+$", v, perl = T)] # [1] "é" "Ḃ" "keepme" v[stri_detect_regex(v, "^[\\p{L} ]+$")] # [1] "é" "Ḃ" "\ua7b4" "\ua7b5" "\ua7b6" "\ua7b7" "keepme"
示例中第3-7个字符(Ꞵ、ꞵ、Ꞷ、ꞷ)属于Latin Extended D Unicode块,在R 3.6.1的PCRE引擎中不被\p{L}匹配,但ICU引擎可正确识别为字母,因此出现了结果差异。
内容的提问来源于stack exchange,提问作者Merijn van Tilborg
相关产品推荐
相关产品推荐

