R stringr ребус - PullRequest
       2

R stringr ребус

0 голосов
/ 05 мая 2019

Я пытался извлечь информацию из строк и не могу получить то, что хочу.В моих данных у меня обычно 4 (но иногда только 3) числа, а иногда за цифрой следует «/» и одно или несколько слов, которые должны быть сохранены.Вот что я попробовал.

library(stringr)
library(rebus)

patrn <- one_or_more(DGT) %R% DOT %R% one_or_more(DGT) %R% optional("/") %R% optional(one_or_more(WRD))

test %>% 
  str_extract_all(., patrn)

Все, что я получил, это первая буква в слове.Я тоже пробовал "[aA-zZ]+", но всегда получаю только первое письмо.Я хотел бы, чтобы эти числа были разделены, как показано ниже, но также и то, что когда-либо придет после чисел, включенных туда.Не уверен, стоит ли мне использовать str_split, но иногда эти строки все вместе, как, например, [[4]].

[[1]]
[1] "20.0" "17.0" "19.0" "20.0"

[[2]]
[1] "12.0" "17.0" "20.0" "14.0"

[[3]]
[1] "15.5" "19.0" "12.5"

[[4]]
[1] "15.0" "17.5" "13.5" "11.5"

data:

test <- c("20.0/Ready Credit 17.0 19.0/Gashaw Boko 20.0", "12.0/Splendid Justine 17.0 20.0/Ranch Pronto 14.0", 
    "15.5/Norman Price 19.0 12.5", "15.0/Hell Broke Luce17.5/Double Boost 13.5 11.5")

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Это то, что вы хотите?

library(stringr)

test <- c("20.0/Ready Credit 17.0 19.0/Gashaw Boko 20.0", 
          "12.0/Splendid Justine 17.0 20.0/Ranch Pronto 14.0", 
          "15.5/Norman Price 19.0 12.5", 
          "15.0/Hell Broke Luce17.5/Double Boost 13.5 11.5")

str_extract_all(test, "[0-9]+\\.[0-9]+[^0-9]*")

[1] "20.0/Ready Credit " "17.0 "              "19.0/Gashaw Boko "  "20.0"              
[1] "12.0/Splendid Justine " "17.0 "                  "20.0/Ranch Pronto "     "14.0"                  
[1] "15.5/Norman Price " "19.0 "              "12.5"              
[1] "15.0/Hell Broke Luce" "17.5/Double Boost "   "13.5 "                "11.5"   
0 голосов
/ 06 мая 2019

Я заметил, что ваш сгенерированный шаблон будет выглядеть следующим образом:

 <regex> [\d]+\.[\d]+[/]?[[\w]+]?

Я считаю, что дополнительные токены должны быть заключены в скобки (вместо скобок) следующим образом:

 <regex> [\d]+\.[\d]+(/)?([\w]+)?

 Or even simpler:

 <regex> [\d]+\.[\d]+(/[\w]+)?

Поэтому в качестве обходного пути я изменил конструкцию вашего паттерна так, чтобы она выглядела следующим образом:

 patrn <- one_or_more(DGT) %R% DOT %R% one_or_more(DGT) %R% "(/" %R% one_or_more(WRD) %R% ")?"
 patrn
 #<regex> [\d]+\.[\d]+(/[\w]+)?

Вы можете даже использовать этот сгенерированный шаблон напрямую для вашего удобства, как указано ниже:

test %>% 
  str_extract_all(., '[\\d]+\\.[\\d]+(/[\\w]+)?')

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

[[1]]
[1] "20.0/Ready"  "17.0"        "19.0/Gashaw" "20.0"       

[[2]]
[1] "12.0/Splendid" "17.0"          "20.0/Ranch"    "14.0"         

[[3]]
[1] "15.5/Norman" "19.0"        "12.5"       

[[4]]
[1] "15.0/Hell"   "17.5/Double" "13.5"        "11.5"  

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...