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

时间:2018-09-06 02:42:46

标签: r regex text split strsplit

问题

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

概述

我想将字符向量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以保留所有数字的建议将不胜感激!谢谢。

2 个答案:

答案 0 :(得分:1)

因为您要在\\d上进行拆分,所以正则表达式中的数字已被消耗 ,而不出现在输出中。改用lookbehind代替数字:

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

http://rextester.com/GDVFU71820

答案 1 :(得分:1)

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

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)使用字符串库:

library(stringr)
str_split_fixed(sample.text, " ", 2)  #outputs a character matrix

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