【问题标题】:String split by character字符串按字符分割
【发布时间】:2016-07-11 15:07:58
【问题描述】:

我有 50 个这种形式的字符串:

 28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11

我想分隔州名后面的字符串。 (在最后一个字符处拆分字符串)但是在字符串末尾附近有字符'F'。所以我用这个把字符串分成两半:

substring(x,1,nchar(x)/2)

现在我只剩下这个了:

28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1

现在我可以尝试将字符串中最后一个字母之后的字符串分开。我怎么做?我知道我正在做的是糟糕的编码习惯(选择将字符串分成两半)。有没有更聪明的方法来做到这一点?

我有一份所有州的清单。我可以用它作为字典来拆分字符串吗?

【问题讨论】:

    标签: regex r string split


    【解决方案1】:

    我们可以使用str_splitn 选项。环顾正则表达式意味着我们在数字值之前和字符之后被一个或多个空格分割。当我们将 'n' 选项指定为 2 时,它将在找到此模式的第一个实例中进行拆分,从而给出两个拆分。

    library(stringr)
    str_split(str1, "(?<=[a-z])\\s+(?=[0-9])", n = 2)[[1]]
    #[1] "28 North Dakota"                                             
    #[2] "0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"
    

    或者不使用包解决方案,我们也可以在创建分隔符后使用strsplit

    strsplit(sub("(.*[a-z])\\s(.*)", "\\1,\\2", str1), ",")[[1]]
    [1] "28 North Dakota"            
    [2] "0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"
    

    如果我们只需要第一部分。我们匹配一个或多个空格 (\\s+) 后跟一个数字 (\\d) 后跟字符到字符串末尾 (.*) 并替换为 ''

    sub("\\s+\\d.*", "", str1)
    #[1] "28 North Dakota"
    

    如果我们只需要状态

    library(stringr)
    str_extract(str1, "[A-Za-z]+\\s*[A-Za-z]+")
    #[1] "North Dakota"
    

    注意:OP 中提到了在状态名称之后进行拆分。

    数据

     str1 <- "28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"
    

    【讨论】:

    • 感谢基本 R 选项!
    【解决方案2】:

    这是一个使用gsub的方法:

    gsub("^\\d+ ([A-Za-z ]+) \\d+.*", "\\1", temp)
    "North Dakota"
    

    开头的正则表达式说匹配一个数字作为第一个字符“^\d”,可能不止一个数字“+”,后跟一个空格“”。然后捕获“()”下一组字母字符“[A-Za-z ]+”以及空格。然后匹配一个空格,后跟至少一位数字“\d+”和任何跟在“.*”之后的内容,“\1”返回捕获的子表达式。

    要返回子字符串的最后部分,您可以将捕获括号移动到正则表达式的相应部分。

    gsub("^\\d+ [A-Za-z ]+ (\\d+.*)", "\\1", temp)
    [1] "0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11"
    

    或者捕获州名和它前面的数字,

    gsub("^(\\d+ [A-Za-z ]+) \\d+.*", "\\1", temp)
    [1] "28 North Dakota
    

    示例字符串:

    temp <- c("28 North Dakota 0 2 1 0 0 1 1 0 0 _1 _2 _1 0 0 0 0 1 0 0 0 0 2 16 F 9.5610957 11")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多