Str_split 只返回字符串的一半

Str_split is returning only half of the string

我有一个小标题,小标题中的向量是混合了英文和普通话字符的字符串。我想将 tibble 分成两列,一列 return 英文,另一列 return 中文。但是,我不得不求助于以下代码来完成此操作:

    tb <- tibble(x = c("I我", "love愛", "you你")) #create tibble
en <- str_split(tb[[1]], "[^A-Za-z]+", simplify = T) #split string when R reads a character that is not a-z
ch <- str_split(tb[[1]], "[A-Za-z]+", simplify = T) #split string after R reads all the a-z characters
tb <- tb %>%
  mutate(EN = en[,1],
         CH = ch[,2]) %>%
  select(-x)#subset the matrices created above, because the matrices create a column of blank/"" values and also remove x column
tb

我猜我的 RegEx 有问题导致了这种情况的发生。理想情况下,我想写一个 str_split 行来 return 两列。

我们可以使用str_match,分别获取英文和其余字符的数据。

stringr::str_match(tb$x, "([A-Za-z]+)(.*)")[, -1]

#     [,1]   [,2]
#[1,] "I"    "我"
#[2,] "love" "愛"
#[3,] "you"  "你"

使用包 stringr 中的 str_extract 的简单解决方案:

library(stringr)
tb$en <- str_extract(tb$x,"[A-z]+")   
tb$ch <- str_extract(tb$x,"[^A-z]")

如果有多个汉字,只需在[^A-z]后加上+即可。

或者,使用 gsub 和反向引用:

tb$en <-  gsub("(\w+).$", "\1", tb$x)
tb$ch <-  gsub("\w+(.$)", "\1", tb$x)

另一种解决方案使用 [ -~]+ 处理 unicode 字符,并使用 [^ -~]+:

排除它们
tb$en <-  str_extract(tb$x, "[ -~]+")
tb$ch <-  str_extract(tb$x, "[^ -~]+")

结果:

tb
# A tibble: 3 x 3
  x      en    ch   
  <chr>  <chr> <chr>
1 I我    I     我   
2 love愛 love  愛   
3 you你  you   你 

我们可以使用 base R

中的 strsplit
do.call(rbind, strsplit(tb$x, "(?<=[A-Za-z])(?=[^A-Za-z])", perl = TRUE))

或者我们可以使用

library(stringr)
tb$en <- str_extract(tb$x,"[[:alpha:]]+")   
tb$ch <- str_extract(tb$x,"[^[:alpha:]]+")