首页 > 解决方案 > 字符串拆分的模式如何成为子字符串本身?

问题描述

我正在清理 R 中的一些字符串,我需要将它们拆分以从两个不属于彼此的子字符串中恢复信息。问题是,我没有真正的模式来分割所有的字符串。相反,我知道我正在寻找的不同子字符串是什么,并且我希望将它们用作执行拆分的模式,而不会在此过程中丢失此模式本身。

假设一个字符串样本的形式为:

test <- c("Some string that explains x. Conflict", 
          "Some string that explains y. Additional information. Precaution",
          "Some string that explains z. Justification.   Conflict") 

我希望将这些字符串拆分为以下列表:

[1] "Some string that explains x."
[2] "Conflict"
[3] "Some string that explains y. Additional information."
[4] "Precaution"
[5] "Some string that explains z. Justification."
[6] "Conflict"

我的问题的中心是我需要保存订单。

显然,我提到的模式是:

pattern <- c("Conflict", "Precaution")

我最初的大多数字符串在解释部分和所谓的模式之间都有一个双空格,所以我可以简单地使用

unlist(strsplit(test, "\\s{2,}"))

来区分它们。我现在意识到其中一些在它们之间只有一个空格,并且这种方法不再起作用,因为解释性字符串最终会被划分为每个单独的单词。

提取它们是我查找的一个选项,但是当我尝试时,我会丢失我必须保留的顺序(我最终创建了一个仅包含提取的子字符串的新列表)。

使用strsplit(),我不能将所述模式用于该函数,因为通过用它拆分字符串,我删除了模式本身。我尝试使用gsub()我发现的一种技巧,用“~”包围模式,然后相应地拆分它,但我发现自己没有成功。

即,

 > unlist(strsplit(test, pattern))
[1] "Some string that explains x. "                        
[2] "Some string that explains y. Additional information. "
[3] "Some string that explains z. Justification.   "

本质上,我如何使用上述模式拆分字符串并获得所需的结果?或者,有没有办法从原始字符串中提取模式并将它们以正确的顺序插入到列表中?

标签: rregexstringsplitstrsplit

解决方案


如果patt通过用 分隔这两个模式将它们组合成一个元素,则该新模式将匹配向量'|'中的两个原始模式中的任何一个。test然后 usingstr_remove可以得到没有模式的部分, usingstr_extract给出匹配模式之一的部分。c(rbind(x, y))现在您可以使用模式*将这两个向量交织成一个向量。这将比直接使用正则表达式来获得我假设的非模式和模式部分的计算效率更低。

注意:所有这些都假设您要提取的模式只是“冲突”或“预防”,并且它们可以出现在字符串中的任何位置。这与其他一些答案中的逻辑不同,这些答案没有识别这两个单词,而是识别字符串的最后一部分。我不完全清楚你想要哪个,所以仅供参考。

library(stringr)
patt <- paste(pattern, collapse = '|')
c(rbind(str_remove(test, patt), str_extract(test, patt)))

# [1] "Some string that explains x. "                        
# [2] "Conflict"                                             
# [3] "Some string that explains y. Additional information. "
# [4] "Precaution"                                           
# [5] "Some string that explains z. Justification.   "       
# [6] "Conflict" 

* 请参见下面的示例。这是有效的,因为c会将矩阵按列转换为向量,并且您正在通过将向量 rbind-ing 在一起来创建矩阵,其中每列的每个向量都有一个元素。

c(rbind(c('a', 'b', 'c'), c('A', 'B', 'C')))
#[1] "a" "A" "b" "B" "c" "C"

推荐阅读