Regex: как сохранить все цифры при разбиении строки? - PullRequest
0 голосов
/ 06 сентября 2018

Вопрос

Используя регулярное выражение, как сохранить все цифры при разбиении строки?

Обзор

Я хотел бы разбить каждый элемент в символьном векторе 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, чтобы сохранить все цифры, будет очень признателен! Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Некоторые альтернативные решения, использующие очень простое сопоставление с образцом при первом появлении пробела:

1) Косвенно, используя sub для замены вашего собственного разделителя, затем strsplit на вашем разделителе:

например. Вы можете заменить ';' для первого пробела (если вы знаете, что этот символ не существует в ваших данных):

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

2) Использование regexpr и regmatches

Вы можете эффективно сопоставить первый "" (пробел) и разделить следующим образом:

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"  
0 голосов
/ 06 сентября 2018

Поскольку вы разделяете на \\d, цифра потребляется в регулярном выражении и отсутствует в выходных данных. Вместо этого используйте lookbehind для цифры:

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

http://rextester.com/GDVFU71820

...