Как извлечь число между двумя строками? - PullRequest
2 голосов
/ 10 июня 2019

У меня есть вектор, как показано ниже

id < c("1250.3000488281_-57.882898769379_OilA")

Мне нужно извлечь число после _ то есть -57.882898769379.

Я попробовал что-то вроде этого

library(magrittr)
id_play %>%
    stringr::str_extract(.,"(?<=[[:punct:]])([0-9]+)(?=_Oil)")

Вместо того, чтобы получить -57 .---- Я получаю все после ".", т. е. "" 882898769379 ".

Как исключить вид сзади, чтобы не включать пунктуацию". "?

Ответы [ 7 ]

6 голосов
/ 10 июня 2019

Опция с sub для захвата одной или нескольких цифр после _ и замены на обратную ссылку (\\1) захваченной группы

sub(".*_(-?[0-9.]+)_.*", "\\1", id)
#[1] "-57.882898769379"
2 голосов
/ 10 июня 2019

Прочитайте это с read.table. Регулярные выражения или пакеты не используются.

read.table(text = id, sep = "_")$V2
## [1] -57.8829
2 голосов
/ 10 июня 2019

Просто замените [[:punct:]] на подчеркивание:

"(?<=_)(-?[0-9.]+)(?=_Oil)"
1 голос
/ 10 июня 2019

Вы можете сделать это следующим образом

(?<=[!-#%-*,-/:;?@\[-\]_{}])[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?=_OilA)

https://regex101.com/r/iznDc1/1

Объяснено

 (?<= [!-#%-*,-/:;?@\[-\]_{}] )      # Behind, an ascii punctuation
 [+-]?                               # Optional plus or minus
 (?:                                 # A valid, parseable, integer or float (non-exponent)
      \d+ 
      (?: \. \d* )?
   |  \. \d+ 
 )
 (?= _OilA )                         # Ahead, this literal
1 голос
/ 10 июня 2019

Используйте strsplit(), а затем извлекайте второй элемент каждой записи.

vapply(strsplit(id, "_"), `[[`, character(1), 2)

Не так эффективно, как sub(), но, возможно, требуются менее специализированные знания регулярных выражений.

0 голосов
/ 10 июня 2019

Я думаю, все, что вам нужно, это получить все между подчеркиванием:

stringr::str_extract(id,"(?<=_).+?(?=_)")

#[1] "-57.882898769379"

0 голосов
/ 10 июня 2019

Ах!Просто добавьте знаки препинания в середине

id_play %>%
    str_extract(.,"(?<=[[:punct:]])([0-9,.,-]+)(?=_Oil)")
...