2017-02-16 49 views
0

编辑以突出显示我正在使用的语言我使用R语言,并且我有许多大字符串列表,并且它们有相似的格式。我对直接位于字符串中的一系列字符前面的字符感兴趣,但字符串中的字符不一致。例如:如何从字符串中提取字符,基于其中的文字R

a <- "aabbccddeeff" 
b <- "aabbddff" 
c <- "aabbffgghhii" 
d <- "bbffgghhii" 

我感兴趣的提取两个字符直接在每个字符串的"ff"前面。我找不到任何合理的解决方案,除了使用grepl()分解每个字符串,然后独立处理它们,这似乎是一种效率低下的方法。

回答

2

您可以匹配这两个字符并使用sub和正确的正则表达式捕获它们。

Strings = c("aabbccddeeff", 
    "aabbddff", 
    "aabbffgghhii", 
    "bbffgghhii") 
sub(".*(\\w\\w)ff.*", "\\1", Strings) 
[1] "ee" "dd" "bb" "bb" 

说明,这将用“ff”前面的两个字符替换整个字符串。如果字符串中有多个“ff”,则此表达式将采用“ff”之前的两个字符。

这是如何工作的:这三个参数子是:
1的模式来搜索
2.什么它将与
3.字符串替换应用它。

大部分的工作是在模式部分 - .*(\\w\\w)ff.*。模式的ff部分必须明显。我们将目标锁定在特定字符串ff附近。什么在它之前是(\\w\\w)。 \ w是指“单词字符”。这意味着任何字母a-z或A-Z,任何数字0-9或另一个字符_。我们需要两个字符,所以我们有\\w\\w。通过将圆括号\\w\\w括起来,它将两个字符的模式变成一个“捕获组”,这个字符串将被保存到一个变量中供以后使用。由于这是该表达式中的第一个(也是唯一的)捕获组,因此这两个字符将存储在名为\ 1的变量中。现在我们只需要这两个角色,以便在我们把.*放在前面和后面前后吹掉所有东西。 .匹配任何字符,并且*表示执行此操作零次或多次,因此.*表示任意字符的零个或多个副本。现在我们把字符串分成四部分:“ff”,“ff”之前的两个字符,之前的所有内容以及ff之后的所有内容。这涵盖了整个字符串。 sub将取代与替换模式中所说的匹配(所有内容)的部分,在本例中为“\ 1”。这就是你如何编写一个字符串,其值为\1,这是我们存储我们想要的两个字符的变量的名称。我们是这样写的,因为反斜杠“逃脱”后面的任何内容。我们实际上需要字符\因此我们写\来表示\和\ 1评估为\ 1。因此,字符串中的所有内容都由目标两个字符替换。我们将其应用于字符串列表Strings中的每个字符串。

+0

非常好。这很好,非常感谢。但是,我正在努力研究什么是被控制的。你可以通过'sub()'函数中的语法来引导我吗? – Jesse

+0

已添加到答案。让我知道你是否需要澄清。 – G5W

相关问题