如何提取两个字符串之间的数字?

时间:2019-06-10 18:44:14

标签: r regex stringr stringi

我有一个像下面的向量

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

我需要提取_即-57.882898769379之后的数字。

我尝试了类似的方法

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

我没有得到-57,而是得到了“。”之后的所有内容。 ,即““ 882898769379”。

如何排除后面的查询不包含标点符号“。”?

7 个答案:

答案 0 :(得分:6)

带有sub的选项,用于捕获_之后的一个或多个数字,并替换为所捕获组的后向引用(\\1

sub(".*_(-?[0-9.]+)_.*", "\\1", id)
#[1] "-57.882898769379"

答案 1 :(得分:2)

只需用下划线替换[[:punct:]]

"(?<=_)(-?[0-9.]+)(?=_Oil)"

答案 2 :(得分:2)

read.table阅读。不使用正则表达式或包。

read.table(text = id, sep = "_")$V2
## [1] -57.8829

答案 3 :(得分:1)

使用strsplit(),然后提取每个记录的第二个元素。

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

效率不如sub(),但可能不那么了解所需的正则表达式。

答案 4 :(得分:1)

您可以这样做

(?<=[!-#%-*,-/:;?@\[-\]_{}])[+-]?(?:\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

答案 5 :(得分:0)

啊!只需在中间添加标点符号

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

答案 6 :(得分:0)

我认为您所需要的只是使所有内容都在下划线之间:

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

#[1] "-57.882898769379"