正则表达式:拆分字符串时如何保留所有数字?
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)
一些替代解决方案,在 space 的第一次出现时使用非常简单的模式匹配:
1) 间接使用 sub
替换您自己的分隔符,然后 strsplit
在您的分隔符上:
例如你可以用';'代替对于第一个 space(如果您知道该字符不存在于您的数据中):
strsplit( sub(' ', ';', sample.text), split=';')
2) 使用 regexpr
和 regmatches
可以有效匹配第一个“”(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"
问题
使用正则表达式,拆分字符串时如何保留所有数字?
概览
我想将字符向量 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)
一些替代解决方案,在 space 的第一次出现时使用非常简单的模式匹配:
1) 间接使用 sub
替换您自己的分隔符,然后 strsplit
在您的分隔符上:
例如你可以用';'代替对于第一个 space(如果您知道该字符不存在于您的数据中):
strsplit( sub(' ', ';', sample.text), split=';')
2) 使用 regexpr
和 regmatches
可以有效匹配第一个“”(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"