正则表达式在Regex101可用但在R中失效的文本挖掘问题
解决R中正则表达式失效的问题并提取目标信息
我来帮你排查问题并实现需求。首先你的代码和正则有几个关键问题,导致在R中无法正常工作:
1. 函数调用的错误
你直接把整个data.frame传给str_extract和grepl,但这两个函数需要的是字符向量,应该指定text$text列,比如:
str_extract(text$text, patt) grepl(pattern = patt, x = text$text)
2. 正则表达式的兼容性问题
Regex101默认常用PCRE引擎,但R的stringr包默认使用ICU正则引擎,两者在语法细节上有差异:
\b在ICU中是严格的单词边界,对非单词字符的处理和PCRE不同;- 你的正则试图一次性匹配所有4类信息,但你的数据中每个文本行只包含部分信息,导致大部分行根本匹配不到;
- 原正则中的
(?:\\D|\\d(?![\\d.]*%))结构在ICU中逻辑过于复杂,且容易出现匹配异常。
解决方案:分模块提取目标信息
我们可以拆分需求,用更灵活的方式提取每类信息,下面是具体实现:
步骤1:加载包并准备数据
library(stringr) library(dplyr) text <- data.frame( page = c(1,1,2,3), sen = c(1,2,1,1), text = c( "Dear Mr case 1", "the value of my property is £500,000.00 and it was built in 1980", "The protected percentage is 0% for 2 years", "The interest rate is fixed for 2 years at 4.8%" ) )
步骤2:提取所有目标信息
我们使用str_match和条件匹配来分别提取四类信息,确保每行都能拿到对应的数据:
# 提取称呼并映射性别 text$title <- str_extract(text$text, "(?i)mr|mrs|miss|ms") text$gender <- case_when( text$title == "Mr" ~ "Male", text$title %in% c("Mrs", "Miss", "Ms") ~ "Female", TRUE ~ NA_character_ ) # 提取房产价值 text$property_value <- str_extract(text$text, "£[\\d,.]+") # 提取保障比例(匹配单独的%值,排除利率场景) text$protected_rate <- str_extract(text$text, "(?<=protected percentage is )\\d+\\.?\\d*%") # 提取利率值 text$interest_rate <- str_extract(text$text, "(?<=interest rate is fixed for 2 years at )\\d+\\.?\\d*%")
最终输出
运行后text数据框会包含所有提取的信息:
page sen text title gender property_value protected_rate interest_rate 1 1 1 Dear Mr case 1 Mr Male <NA> <NA> <NA> 2 1 2 the value of my property is £500,000.00 and it was built in 1980 <NA> <NA> £500,000.00 <NA> <NA> 3 2 1 The protected percentage is 0% for 2 years <NA> <NA> <NA> 0% <NA> 4 3 1 The interest rate is fixed for 2 years at 4.8% <NA> <NA> <NA> <NA> 4.8%
关键说明
(?i)开启不区分大小写匹配,能兼容Dear/dear、MR/mr等写法;- 使用正向预查
(?<=...)精准定位目标值的上下文,避免误匹配; - 拆分提取逻辑后,每类信息的匹配更稳定,也更容易维护和调整。
内容的提问来源于stack exchange,提问作者SAJ
相关产品推荐
相关产品推荐

