【问题标题】:Split strings at the first colon在第一个冒号处拆分字符串
【发布时间】:2012-08-27 08:19:34
【问题描述】:

我正在使用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

对不起,如果这是我没有找到的帖子的重复,并感谢您的任何建议或帮助。

【问题讨论】:

    标签: regex r string gsub


    【解决方案1】:

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

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

    如果你不想删除你可以做的空格

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

    为了澄清原始正则表达式的作用。从头开始:

    ^ 这表示只在字符串的开头查找匹配项

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

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

    :这实际上是与冒号匹配的

    \\s 这匹配一个空格

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

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

    【讨论】:

    • 感谢您的回答和出色的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2022-01-15
    • 2013-04-19
    相关资源
    最近更新 更多