您可以匹配这两个字符并使用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
中的每个字符串。
来源
2017-02-16 21:16:35
G5W
非常好。这很好,非常感谢。但是,我正在努力研究什么是被控制的。你可以通过'sub()'函数中的语法来引导我吗? – Jesse
已添加到答案。让我知道你是否需要澄清。 – G5W