You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:22:43