R Regex:匹配第一个和最后一个空格之间的字符串

时间:2018-03-28 18:26:55

标签: r regex string finance

我有一个R数据框,其中包含一个包含以下类型字符串的列:

String

我想使用正则表达式来匹配第一个空格和最后一个空格之间的字符串部分。

因此输出为:

comma

一些背景资料:

这些是债券描述。第一行的第一段是国家/地区密钥(DBR =德国)。最后一部分是指到期日(2025年2月15日的第一个债券)。

在国家/地区密钥和到期日之间,债券的优惠券使用了几种不同的约定。例如,德国债券有0.5%的优惠券,第二(法国)债券有3%的优惠券,而最终的(意大利)债券有1.35%的优惠券。

我已经知道如何通过

匹配国家/地区密钥和到期日期
if let range = text.range(of: " ", options: .backwards) {
  let suffix = String(text.suffix(from: range.upperBound)) 
  print(suffix) // tom@domain.com
}

然后我希望在比赛结束后将优惠券处理成统一格式,以便进一步计算。

DBR 0 1/2 02/15/25
FRTR 3 04/25/22
BTPS 1.35 04/15/22

优惠券的混合格式也是我想仅在第一个和最后一个空格之间提取的原因。例如,第一个债券在优惠券中有一个额外的空间。

谢谢。

2 个答案:

答案 0 :(得分:3)

#note {
  display: block;
  -webkit-transition: -webkit-transform .3s ease-out;
  -moz-transition: -moz-transform .3s ease-out;
  -o-transition: -o-transform .3s ease-out;
  -ms-transition: -ms-transform .3s ease-out;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
  transition: box-shadow 0.3s ease-in-out, transform .3s ease-out;
  width: 125px;
  height: 175px;
  overflow: hidden; /* Added */
  position: relative; /* Added */
}

#note:hover {
  -webkit-box-shadow: 12px 18px 53px 0 rgba(148, 138, 148, 0.81);
  -moz-box-shadow: 12px 18px 53px 0 rgba(148, 138, 148, 0.81);
  box-shadow: 12px 18px 53px 0 rgba(148, 138, 148, 0.81);
  -webkit-transform: scale(1.3);
  -moz-transform: scale(1.3);
  -ms-transform: scale(1.3);
  -o-transform: scale(1.3);
  transform: scale(1.3);
  display: block;
  width: 125px;
  height: 175px;
}

#text1 {
  opacity: 0;
  transition: all 0.5s ease 0s;
  padding: 10px; /* Added */
  width: 125px; /* Added */
  height: 175px; /* Added */
  position: absolute; /* Added */
  bottom: 100%; /* Added */
  left: 0px; /* Added */
  -webkit-box-sizing: border-box; /* Added */
  -moz-box-sizing: border-box; /* Added */
  box-sizing: border-box; /* Added */
}

#note:hover #text1 {
  opacity: 1;
  bottom: 0px; /* Added */
}

一点细节:

<div id="note">
  <img src="http://www.simpleimageresizer.com/_uploads/photos/b8804940/Chick_Pea_Wrap_1_125x175.jpg">
  <div id="text1">
    <p>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    </p>
  </div>
</div>

答案 1 :(得分:0)

以下是base R中的完整演练:

df <- data.frame(junk = c("DBR 0 1/2 02/15/25", "FRTR 3 04/25/22", "BTPS 1.35 04/15/22"), stringsAsFactors = FALSE)
df$coupon <- sapply(df$junk, function (item) {
  frac <- sub(".*?([\\d./]+)$", "\\1", sub(".*?\\s+(.*)\\s.*", "\\1", item, perl=TRUE), perl = TRUE)
  eval(parse(text = frac))
})
df

<小时/> 这产生了

                junk coupon
1 DBR 0 1/2 02/15/25   0.50
2    FRTR 3 04/25/22   3.00
3 BTPS 1.35 04/15/22   1.35

我们的想法是应用两个正则表达式eval()结果。

<小时/> 或者 - 使用dplyr和一些错误处理:

library(dplyr)

df <- data_frame(junk = c("DBR 0 1/2 02/15/25", 
                          "FRTR 3 04/25/22", 
                          "BTPS 1.35 04/15/22",
                          "someweirdojunk"))

make_coupon <- function(col) {
  result <- sapply(col, function (item) {
    tryCatch({
      frac <- sub(".*?([\\d./]+)$", "\\1", sub(".*?\\s+(.*)\\s.*", "\\1", item))
      eval(parse(text = frac))
    }, error = function(e) {
      NA
    })
  })
  return(result)
}

df %>%
  mutate(coupon = make_coupon(junk))

这会产生:

# A tibble: 4 x 2
  junk               coupon
  <chr>               <dbl>
1 DBR 0 1/2 02/15/25  0.500
2 FRTR 3 04/25/22     3.00 
3 BTPS 1.35 04/15/22  1.35 
4 someweirdojunk      NA