在第一个冒号处拆分字符串

时间:2012-09-02 05:05:07

标签: regex r string gsub

我正在使用readLines以文本格式阅读数据文件。第一个“列”是我不需要的复杂文本。下一列包含我需要的数据。第一个“列”和数据用冒号(:)分隔。我希望在第一个冒号处拆分每一行并删除生成的文本字符串,仅保留数据。

下面是一个示例数据文件。一个潜在的复杂因素是一行数据包含多个冒号。这条线可能在某些时候成为我的标题。所以,我可能不应该在每个结肠处分开,只是在第一个结肠处。

my.data <- "first string of text..:  aa : bb : cc 
            next string ........  :   2    0    2
            third string......1990:   7    6    5
            last string           :   4    2    3"

my.data2 <- readLines(textConnection(my.data))
my.data2

我试过这里提供的代码:

Split on first comma in string

在这里:

R: removing the last three dots from a string

上面第一个链接的代码似乎只在第一行的第一个冒号处分开。第二个链接的代码可能会做我想要的,但对我来说太复杂了,到目前为止还无法成功修改它。

以下是我希望获得的数据,此时我可以使用非常简单的gsub语句简单地用空格替换第一行中剩余的冒号:

   aa : bb : cc 
    2    0    2
    7    6    5
    4    2    3

很抱歉,如果这是我未找到的帖子的副本,请感谢您提供任何建议或帮助。

1 个答案:

答案 0 :(得分:15)

以下内容将从字符串的开头开始,然后抓取所有内容,包括第一个冒号和任何其他空格,并将其替换为空(基本上只是删除它)

gsub("^[^:]+:\\s*", "", my.data2)

如果您不想删除可以执行的空格

gsub("^[^:]+:", "", my.data2)

有关原始正则表达式正在做什么的一些说明。从头开始:

^这说只能在字符串

的开头找到匹配项

[^:]这表示任何不是冒号的字符

+这表示要匹配前面的字符一次或多次(所以匹配尽可能多的非冒号字符)

:这实际上与冒号相匹配

\\s这匹配空格

*这表示要匹配前面的字符零次或多次(所以我们删除冒号后的任何额外空格)

所以把它们放在一起我们从字符串的开头开始然后匹配尽可能多的非冒号字符然后抓取第一个冒号字符和任何其他空格并用什么都不替换所有这些(基本上删除所有垃圾)我们不想要。)