在stringr中分割一个字符串,其中大写字母跟随小写字母

3

我有一个字符串向量,看起来像这样,我想把它拆分成几部分:

str <- c("Fruit LoopsJalapeno Sandwich", "Red Bagel", "Basil LeafBarbeque SauceFried Beef")

str_split(str, '[a-z][A-Z]', n = 3)

[[1]]
[1] "Fruit Loop"       "alapeno Sandwich"

[[2]]
[1] "Red Bagel"

[[3]]
[1] "Basil Lea"    "arbeque Sauc" "ried Beef"

但是我需要保留单词的开头和结尾处的字母。

2个回答

5

这里有两种基本方法(如果需要可以推广到stringr)。
此方法将此位置替换为占位符,然后在该占位符上进行分割。

strsplit(gsub("([a-z])([A-Z])", "\\1SPLITHERE\\2", str), "SPLITHERE")

## [[1]]
## [1] "Fruit Loops"       "Jalapeno Sandwich"
## 
## [[2]]
## [1] "Red Bagel"
## 
## [[3]]
## [1] "Basil Leaf"     "Barbeque Sauce" "Fried Beef"  

这种方法使用前瞻和后顾:

strsplit(str, "(?<=[a-z])(?=[A-Z])", perl=TRUE)

## [[1]]
## [1] "Fruit Loops"       "Jalapeno Sandwich"
## 
## [[2]]
## [1] "Red Bagel"
## 
## [[3]]
## [1] "Basil Leaf"     "Barbeque Sauce" "Fried Beef"  

编辑 泛化为 stringr,因此您可以选择抓取3个部分

stringr::str_split(gsub("([a-z])([A-Z])", "\\1SPLITHERE\\2", str), "SPLITHERE", 3)

3
你可以使用匹配函数而不是根据字符串进行拆分来实现同样的效果。
unlist(regmatches(str, gregexpr('[A-Z][a-z]+ [A-Z][a-z]+', str)))
# [1] "Fruit Loops"       "Jalapeno Sandwich" "Red Bagel"        
# [4] "Basil Leaf"        "Barbeque Sauce"    "Fried Beef" 

不错,可能更有效率 +1 - Tyler Rinker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接