基于R语言正则提取会议注册字符串中多产品指定信息
会议注册信息的字符串提取方案需求
我正在收集会议注册信息,表单将每条记录输出为单个字符串,其中包含购买的不同产品(如注册、研讨会、实地考察等),结构重复但内容可变。需要从包含对应产品的记录中提取各产品的指定信息(如注册类型、研讨会类型),理想情况下还需获取每个产品的价格、产品选项及适用的数量(仅会议支持和宴会票)。
示例数据
x <- c("Workshop (May 8) (Amount: 55.00 USD, : Structured Decision Making) Field Trip (May 12) (Amount: 85.00 USD, : AK Wildlife Conservation Center) Total: 140.00 USD", "Workshop (May 8) (Amount: 55.00 USD, : Structured Decision Making) Total: 55.00 USD", "Conference Registration (Amount: 440.00 USD, : Regular) Total: 440.00 USD", "Conference Registration (Amount: 440.00 USD, : Regular) Workshop (May 8) (Amount: 55.00 USD, : TuktuTools and Earth Engine) Total: 495.00 USD", "Conference Registration (Amount: 440.00 USD, : Regular) Total: 440.00 USD", "Conference Registration (Amount: 440.00 USD, : Regular) Conference Support (Amount: 5.00 USD, Quantity: 10) Discount: -489.95 Total: 0.05 USD Coupon used: JFtest", "Conference Registration (Amount: 440.00 USD, : Regular) Workshop (May 8) (Amount: 40.00 USD, : Storytelling) Field Trip (May 12) (Amount: 65.00 USD, : Vegetation Walk) Banquet, Additonal Ticket(s) (Amount: 65.00 USD, Quantity: 1) Discount: -609.94 Total: 0.06 USD Coupon used: JFtest", "Conference Registration (Amount: 180.00 USD, : Single-day (May 10)) Workshop (May 8) (Amount: 55.00 USD, : Structured Decision Making) Discount: -234.98 Total: 0.02 USD Coupon used: JFtest", "Conference Registration (Amount: 180.00 USD, : Single-day (May 9)) Discount: -179.98 Total: 0.02 USD Coupon used: JFtest", "Conference Registration (Amount: 440.00 USD, : Regular) Discount: -440.00 Total: 0.00 USD Coupon used: ARCTIC2023")
已实现的提取操作
目前已完成总费用和优惠券代码的提取:
# 提取总费用 as.numeric(str_extract(x, '(?<=Total: ).+(?= USD)')) # 提取优惠券代码 str_extract(x, '(?<= Coupon used: ).+')
提取难点与预期输出
在提取特定产品括号内的信息时遇到困难,预期输出如下:
注册类型预期结果
c(NA, NA, "Regular", "Regular", "Regular", "Regular", "Regular", "Single-day (May 10)", "Single-day (May 9)", "Regular")
研讨会类型预期结果
c("Structured Decision Making", "Structured Decision Making", NA, "TuktuTools and Earth Engine", NA, NA, "Storytelling", "Structured Decision Making", NA, NA)
尝试过的方法及问题
- 使用
stringr结合if_else的方法,仅在注册为唯一产品时有效:
library(stringr) library(dplyr) if_else( str_detect(string = x, pattern = 'Conference Registration'), str_extract(x, '(?<=USD, : ).+(?=\\) )'), NA_character_)
该方法在字符串包含多个产品时,无法精准匹配到注册产品对应的信息。
- 尝试
gsub直接提取注册相关信息,但因字符串内容可变(含字母、连字符、数字、括号)且可能存在多匹配而受阻。后续尝试硬编码所有可变情况,操作繁琐且出现匹配错误,还因gsub最多支持9个反向引用,无法提取更多产品信息。
现寻求可行的字符串数据提取方案,此前参考的相关帖子未覆盖此类格式可变、需精准提取部分括号内容的场景。
内容的提问来源于stack exchange,提问作者TimF
相关产品推荐
相关产品推荐

