如何根据R中围绕它们的文本从字符串中提取字符

时间:2017-02-16 21:07:58

标签: r string character extract

编辑以突出显示我使用的语言我使用R语言并且我有许多大字符串列表,并且它们具有相似的格式。我对字符串中一致的字符前面的字符感兴趣,但不在字符串中的一致位置。例如:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

这是如何工作的:sub的三个参数是:
   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列表中的每个字符串。