str_split仅返回半段字符串?如何用单次str_split拆分tibble中英文列
嘿,我来帮你搞定这个中英文拆分的问题!
你之前的代码之所以会出现“仅返回半段字符串”的情况,是因为你用str_split时把其中一类字符当成了分隔符——比如用[^A-Za-z]+拆分时,会把中文当成分隔符,拆分后就会多出空字符串;反过来用[A-Za-z]+拆分则会把英文当成分隔符,同样产生空值,所以需要手动取对应列,既麻烦又冗余。
要实现“一行拆分出两列”的需求,我们可以利用零宽断言正则,精准定位英文和中文之间的分界点,这样拆分时不会破坏原有的字符内容,直接得到干净的两列:
library(tibble) library(stringr) # 构造示例数据 tb <- tibble(x = c("I我", "love愛", "you你")) # 一行拆分+转列搞定 tb %>% transmute( EN = str_split_fixed(x, "(?<=[A-Za-z])(?=[\u4e00-\u9fa5])", n = 2)[,1], CH = str_split_fixed(x, "(?<=[A-Za-z])(?=[\u4e00-\u9fa5])", n = 2)[,2] )
运行后就能得到你想要的结果:
# A tibble: 3 × 2 EN CH <chr> <chr> 1 I 我 2 love 愛 3 you 你
正则说明
(?<=[A-Za-z])(?=[\u4e00-\u9fa5])是一个零宽断言组合:
(?<=[A-Za-z]):正向回顾断言,确保当前位置前面是英文字母(?=[\u4e00-\u9fa5]):正向展望断言,确保当前位置后面是中文字符(\u4e00-\u9fa5是中文汉字的Unicode编码范围)
这个正则会精准匹配英文和中文之间的“缝隙”,用它作为分隔符拆分,就不会把任何字符当成分隔符丢弃,自然能直接得到完整的英文和中文内容。
如果你的字符串可能出现中文在前、英文在后的情况,只需把正则改成双向匹配即可:
"(?<=[\u4e00-\u9fa5])(?=[A-Za-z])|(?<=[A-Za-z])(?=[\u4e00-\u9fa5])"
内容的提问来源于stack exchange,提问作者WOT
相关产品推荐
相关产品推荐

