如何使用R正则表达式匹配字符串首尾空格间的内容?
提取债券描述中的票面利率部分(R实现)
刚好碰到过类似的需求,给你分享两种在R里实现的方法,完美匹配你要的结果:
需求回顾
我们需要从格式如DBR 0 1/2 02/15/25、FRTR 3 04/25/22的债券描述字符串中,提取第一个空格与最后一个空格之间的内容,也就是债券的票面利率部分,预期输出为0 1/2、3、1.35。
实现步骤
1. 构造示例数据框
先模拟你提到的R数据框:
bond_df <- data.frame( bond_desc = c("DBR 0 1/2 02/15/25", "FRTR 3 04/25/22", "BTPS 1.35 04/15/22") )
2. 方法一:基础R原生函数sub
利用正则表达式的捕获组功能,直接提取目标内容:
# 提取第一个空格后、最后一个空格前的内容 bond_df$coupon <- sub("^[^ ]+ (.*) \\d{2}/\\d{2}/\\d{2}$", "\\1", bond_df$bond_desc)
正则表达式解释:
^[^ ]+:匹配字符串开头到第一个空格的国家代码部分(.*):捕获组,匹配第一个空格后到最后一个空格前的所有内容(这就是我们要的利率)\\d{2}/\\d{2}/\\d{2}$:匹配最后一个空格后的到期日格式(两位月/两位日/两位年)\\1:将整个字符串替换为捕获组1的内容,也就是我们要提取的部分
3. 方法二:stringr包简化操作
如果你习惯用tidyverse系列工具,stringr的str_match会更直观:
library(stringr) # 提取捕获组的内容 bond_df$coupon <- str_match(bond_df$bond_desc, "^[^ ]+ (.*) \\d{2}/\\d{2}/\\d{2}$")[, 2]
验证结果
运行上述代码后,bond_df$coupon列的输出就是:
[1] "0 1/2" "3" "1.35"
完全符合预期~
扩展说明
如果你的到期日格式包含四位年份(比如02/15/2025),只需把正则中的\\d{2}改成\\d{2,4}即可适配:
# 适配两位/四位年份的到期日 bond_df$coupon <- sub("^[^ ]+ (.*) \\d{2}/\\d{2}/\\d{2,4}$", "\\1", bond_df$bond_desc)
内容的提问来源于stack exchange,提问作者RSX
相关产品推荐
相关产品推荐

