【问题标题】:Regex: how to keep all digits when splitting a string?正则表达式:拆分字符串时如何保留所有数字?
【发布时间】:2019-02-11 05:26:14
【问题描述】:

问题

使用正则表达式,拆分字符串时如何保留所有数字?

概述

我想将字符向量 sample.text 中的每个元素拆分为两个元素:一个只有数字,另一个只有文本。

当前尝试删除最后一位

base::strsplit() 内部的这个正则表达式 - \\d\\s{1} 删除了最后一位数字。以下是我的尝试,以及我想要的输出。

# load necessary data -----
sample.text <-
  c("111110 Soybean Farming", "0116 Soybeans")

# split string by digit and one space pattern ------
strsplit(sample.text, split = "\\d\\s{1}")
# [[1]]
# [1] "11111"           "Soybean Farming"
# 
# [[2]]
# [1] "011"      "Soybeans"

# desired output --------
# [[1]]
# [1] "111110"           "Soybean Farming"
# 
# [[2]]
# [1] "0116"      "Soybeans"

# end of script #

任何关于如何拆分sample.text 以保留所有数字的建议将不胜感激!谢谢。

【问题讨论】:

    标签: r regex text split strsplit


    【解决方案1】:

    因为您在\\d 上进行拆分,所以正则表达式中存在已消耗 的数字,并且不存在于输出中。使用lookbehind代替数字:

    strsplit(sample.text, split = "(?<=\\d) ", perl=TRUE)
    

    http://rextester.com/GDVFU71820

    【讨论】:

    • 谢谢!非常感谢您的快速回复,并向我展示了如何在正则表达式中正确使用后置。
    【解决方案2】:

    一些替代解决方案,在第一次出现空格时使用非常简单的模式匹配:

    1) 间接使用sub 替换您自己的分隔符,然后在您的分隔符上使用strsplit

    例如你可以用';'代替第一个空格(如果您知道数据中不存在该字符):

    strsplit( sub(' ', ';', sample.text), split=';')
    

    2) 使用regexprregmatches

    你可以在第一个“”(空格字符)上进行有效匹配,然后拆分如下:

    regmatches(sample.text, regexpr(" ", sample.text), invert = TRUE)
    

    结果是一个列表,如果这是您根据样本所需的输出所追求的:

    [[1]]
    [1] "111110"          "Soybean Farming"
    
    [[2]]
    [1] "0116"     "Soybeans"
    

    3) 使用 stringr 库:

    library(stringr)
    str_split_fixed(sample.text, " ", 2)  #outputs a character matrix
    
         [,1]     [,2]             
    [1,] "111110" "Soybean Farming"
    [2,] "0116"   "Soybeans"  
    

    【讨论】:

    • 这太棒了!感谢您向我展示sub()regmatches()/regexpr()str_split_fixed() 的用处。我最终可能会利用最后一个,因为我最终将该输出转换为 4 列 tibbledata.frame。感谢您的彻底!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2011-02-24
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多