在R

时间:2016-03-02 17:24:12

标签: r regex

我有一个字符串字符串矢量,看起来像这样

ABC_EFG_HIG_ADF_AKF_MNB

现在从这个元素的每一个我想提取第三组字符串(从左边),即在这种情况下HIG。我怎样才能在R

中实现这一目标

4 个答案:

答案 0 :(得分:8)

这是另一种可能性:

strsplit(str1,"_")[[1]][3]
#[1] "HIG"

命令strsplit()的名字就是它的名字:它会分割一个字符串。第二个参数是字符串被分割的字符,无论它在字符串中的哪个位置。

或许有点令人惊讶的是,strsplit()会返回一个列表。因此,我们可以使用unlist()来访问原始字符串的结果分割部分,或者在这种情况下使用列表[[1]]的索引来解决它们,因为此示例中的列表只有一个成员,由六个字符串组成(参见str(strsplit(str1,"_"))的输出)。 要访问此列表的第三个条目,我们可以在命令末尾指定[3]

字符串str1在此处定义为@akrun的答案。

答案 1 :(得分:5)

我们可以使用sub。我们匹配的一个或多个字符不是_[^_]+),后跟_。将其保存在捕获组中。由于我们想要提取第三组非_字符,我们重复先前包含的组2次({2}),然后是另一个包含一个或多个非_字符的捕获组,并且由.*表示的其余字符。在替换中,我们使用第二个捕获组(\\2)的反向引用。

sub("^([^_]+_){2}([^_]+).*", "\\2", str1)
#[1] "HIG"

或另一个选项是scan

scan(text=str1, sep="_", what="", quiet=TRUE)[3]
#[1] "HIG"

@RHertel提到的类似选项是在字符串上使用read.table/read.csv

 read.table(text=str1,sep = "_", stringsAsFactors=FALSE)[,3]

数据

str1 <- "ABC_EFG_HIG_ADF_AKF_MNB"

答案 2 :(得分:4)

substr按位置提取子字符串:

substr('ABC_EFG_HIG_ADF_AKF_MNB', 9, 11)

返回

[1] "HIG"

答案 3 :(得分:2)

如果您知道要查找的模式的位置,并且知道它是固定的(这里介于9和11个字符之间),则可以从stringr包中简单地使用str_sub()。

MyString = 'ABC_EFG_HIG_ADF_AKF_MNB'
str_sub(MyString, 9, 11)