为何forstringr::str_split_extract无法像其他字符一样按句号(.)拆分?
为什么
forstringr::str_split_extract没法按句号(.)正常拆分字符串? 核心原因是:str_split_extract的分隔符参数默认会被当作正则表达式解析,而句号.在正则里是个特殊元字符——它代表“匹配任意单个字符”,不是字面意义上的句号。
当你直接传.作为分隔符时,函数会把字符串里的每一个字符都当成分隔符,拆分后得到的每一段都是空字符串。这时候不管提取第1段还是第4段,自然找不到有效内容,所以全返回NA。
解决办法
要匹配字面意义的句号,有两种简单方式:
1. 对句号进行转义
在R的字符串里,需要用双反斜杠\\.来表示字面意义的句号(单个反斜杠是R字符串的转义符,要让正则识别到转义的句号,得写两个):
code <- c("HS.IB.EDE", "OG.OYO.CAS.0121", "NY.ILR.NIG.036") str_split_extract(code, "\\.", 1) str_split_extract(code, "\\.", 4)
运行结果:
> str_split_extract(code, "\\.", 1) [1] "HS" "OG" "NY" > str_split_extract(code, "\\.", 4) [1] NA "0121" "036"
2. 用fixed()包裹分隔符
fixed()可以明确告诉函数:按固定字符串匹配,不要把分隔符当成正则解析:
str_split_extract(code, fixed("."), 1) str_split_extract(code, fixed("."), 4)
运行结果和上面完全一致。
顺便提一句:除了句号,正则里还有*、+、?、[]、()这类特殊字符,如果要匹配它们的字面意义,都可以用这两种方法处理。
内容的提问来源于stack exchange,提问作者Lachlan Macnish
相关产品推荐
相关产品推荐

