我有一个像下面的向量
id < c("1250.3000488281_-57.882898769379_OilA")
我需要提取_即-57.882898769379之后的数字。
我尝试了类似的方法
library(magrittr)
id_play %>%
stringr::str_extract(.,"(?<=[[:punct:]])([0-9]+)(?=_Oil)")
我没有得到-57,而是得到了“。”之后的所有内容。 ,即““ 882898769379”。
如何排除后面的查询不包含标点符号“。”?
答案 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"