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

Regex: how to keep all digits when splitting a string?

问题

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

概览

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

当前尝试删除最后一位数字

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

# 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 以保留所有数字的建议都将不胜感激!谢谢。

因为您在 \d 上进行拆分,所以正则表达式中的数字 consumed 没有出现在输出中。改用后向数字:

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

http://rextester.com/GDVFU71820

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

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

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

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

2) 使用 regexprregmatches

可以有效匹配第一个“”(space字符),拆分如下:

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"