首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:根据模式删除字符串的第一部分和最后一部分

R:根据模式删除字符串的第一部分和最后一部分
EN

Stack Overflow用户
提问于 2015-04-09 05:58:58
回答 4查看 432关注 0票数 1

这个字符串是一个键的标记:OAT 3 25/32 7/17/17。我想提取的优惠券率是325/32,并被读为3 + 25/323.78125。现在,我一直试图用OAT删除日期和名称gsub,但是遇到了一些问题。

这是删除日期的代码:

代码语言:javascript
复制
tkr.bond <- 'OAT 3 25/32 7/17/17'
tkr.ptrn <- '[0-9][[:punct:]][0-9][[:punct:]][0-9]'
gsub(tkr.ptrn, "", tkr.bond)

然而,它给了我同样的字符串。当我在模式中使用[0-9][[:punct:]][0-9]时,我设法删除了日期的一部分,但是它也删除了债券息票利率的分数部分。

棘手的事情是找到一个不涉及优惠券模式的解决方案,因为代码代码有以下形式:名称优惠券日期,因此,对优惠券使用特定模式可能会限制解决方案的范围。例如,如果代码为OAT 0 7/17/17,则优惠券为零。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-09 06:06:36

试一试

代码语言:javascript
复制
eval(parse(text=sub('[A-Z]+ ([0-9]+ )([0-9/]+) .*', '\\1 + \\2', tkr.bond)))
#[1] 3.78125

或者你可能需要

代码语言:javascript
复制
sub('^[A-Z]+ ([^A-Z]+) [^ ]+$', '\\1', tkr.bond)
#[1] "3 25/32"

更新

代码语言:javascript
复制
tkr.bond1 <- c(tkr.bond, 'OAT 0 7/17/17')
v1 <- sub('^[A-Z]+ ([^A-Z]+) [^ ]+$', '\\1', tkr.bond1)
unname(sapply(sub(' ', '+', v1), function(x) eval(parse(text=x))))
#[1] 3.78125 0.00000

代码语言:javascript
复制
vapply(strsplit(tkr.bond1, ' '), function(x)  
  eval(parse(text= paste(x[-c(1, length(x))], collapse="+"))), 0)
#[1] 3.78125 0.00000

或者没有eval(parse

代码语言:javascript
复制
 vapply(strsplit(gsub('^[^ ]+ | [^ ]+$', '', tkr.bond1), '[ /]'), function(x) {
         x1 <- as.numeric(x)
         sum(x1[1], x1[2]/x1[3], na.rm=TRUE)}, 0)
#[1] 3.78125 0.00000
票数 1
EN

Stack Overflow用户

发布于 2015-04-09 06:26:10

只需用空字符串替换第一个单词和最后一个单词。

代码语言:javascript
复制
> tkr.bond <- 'OAT 3 25/32 7/17/17'
> gsub("^\\S+\\s*|\\s*\\S+$", "", tkr.bond)
[1] "3 25/32"

使用gsubfn函数按顺序使用替换部分中的函数.

代码语言:javascript
复制
> gsubfn("^\\S+\\s+(\\d+)\\s+(\\d+)/(\\d+).*", ~ as.numeric(x) + as.numeric(y)/as.numeric(z), tkr.bond)
[1] "3.78125"

更新:

代码语言:javascript
复制
> tkr.bond1 <- c(tkr.bond, 'OAT 0 7/17/17')
> m <- gsub("^\\S+\\s*|\\s*\\S+$", "", tkr.bond1)
> gsubfn(".+", ~ eval(parse(text=x)), gsub("\\s+", "+", m))
[1] "3.78125" "0" 
票数 2
EN

Stack Overflow用户

发布于 2015-04-09 06:11:21

类似于akrun的答案,使用sub替换。它的工作原理:你把你的“想要的”模式放在括号里,把其余的放在括号之外(同时仍然把regex字符和你不想保留的字符匹配起来)。然后,当您说replacement = "\\1"时,您表示整个字符串只能由括号内的内容替换。

代码语言:javascript
复制
sub(pattern = ".*\\s(\\d\\s\\d+\\/\\d+)\\s.*", replacement = "\\1", x = tkr.bond, perl = TRUE)

# [1] "3 25/32"

然后您可以将其更改为数字:

代码语言:javascript
复制
temp <- sub(pattern = ".*\\s(\\d\\s\\d+\\/\\d+)\\s.*", replacement = "\\1", x = tkr.bond, perl = TRUE)

eval(parse(text=sub(" ","+",x = temp)))

# [1] 3.78125
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29530864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档