You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言提取特定字符串仅部分值生效的问题排查

问题:R语言正则提取长字符串特定内容失败

问题说明

我用R处理仅含一列的长字符串数据框,目标是提取位于__和_之间的文本,写了如下代码但仅第二行生效,第一行未得到预期结果。

我的代码

#Extract
x1$Var<- gsub('\n\n','_',x1$Var)
x1$Extract<- gsub(".*[__]([^.]+)[_].*", "\1", x1$Var)

实际提取结果

[1] "Modelo de gestión de riesgos para Compañías de Seguros domiciliadas en Ecuador"
[2] "Cumbal Vargas, Kelly Salomé\n (PUCE - Quito, 2021-03-18)" 

预期提取结果

Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)
Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)

测试数据

数据x1

x1 <- structure(list(Var = c("\n\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n                    <U+FEFF> \n                \n\n\n\nSilva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n", 
"\n\n\nAnálisis de costos para la producción de leche en la Hacienda del Teca para el año 2020\n\n                    <U+FEFF> \n                \n\n\n\nCumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)\n\nEl presente trabajo fue desarrollado en la Hacienda del Teca, propiedad dedicada a la\r\nproducción de leche.\r\nLa investigación se centró en la manera en la que la Hacienda costeaba el litro de leche, a\r\npartir de esto se ...\n\n"
)), row.names = 54:55, class = "data.frame")

数据x3

x3 <- structure(list(Var = c("\n\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n                    <U+FEFF> \n                \n\n\n\nSilva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n", 
"\n\n\nAnálisis de costos para la producción de leche en la Hacienda del Teca para el año 2020\n\n                    <U+FEFF> \n                \n\n\n\nCumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)\n\nEl presente trabajo fue desarrollado en la Hacienda del Teca, propiedad dedicada a la\r\nproducción de leche.\r\nLa investigación se centró en la manera en la que la Hacienda costeaba el litro de leche, a\r\npartir de esto se ...\n\n", 
"\n\n\nDiseño de un sistema de gestión de la calidad basado en la norma Iso 9001:2008 para los procesos relacionados con el cliente en la empresa la Competencia S.A.\n\n                    <U+FEFF> \n                \n\n\nCadena Echeverría, Jaime Luis Hermel* (ITAM, 2014)\n\nEn el presente trabajo se ha diseñado la documentación requerida para un sistema de\r\ngestión de la calidad basado en la Norma ISO 9001:2008 de los procesos relacionados con\r\nel cliente de la empresa La Competencia S.A., ...\n\n"
)), row.names = c(NA, -3L), class = "data.frame")

问题分析与解决

你的正则和处理逻辑存在几个问题:

  1. [__]等价于单个_,方括号里的重复字符会被视为单一字符,无法匹配两个连续下划线
  2. [^.]+仅排除.,但目标内容后不是.,且第一行替换换行后,正则会匹配到最前面的下划线区间,而非目标内容
  3. 替换时\1未转义,R会将其识别为特殊字符,正确写法应为\\1

另外观察数据结构,目标内容实际是四个连续换行后到下一组两个连续换行前的部分,基于这个结构提取更准确。

修正方案

方案一:直接匹配目标内容结构(无需替换换行)

使用stringr包的非贪婪匹配提取:

# 安装并加载stringr(如果没装的话)
# install.packages("stringr")
library(stringr)

# 处理x1
x1$Extract <- str_extract(x1$Var, "(?<=\\n\\n\\n\\n).*?(?=\\n\\n)")
# 处理x3
x3$Extract <- str_extract(x3$Var, "(?<=\\n\\n\\n\\n).*?(?=\\n\\n)")
  • (?<=\\n\\n\\n\\n):正向断言,定位到四个连续换行之后的位置
  • .*?:非贪婪匹配任意字符,直到遇到下一组两个连续换行
  • (?=\\n\\n):正向断言,定位到两个连续换行之前的位置

方案二:修正原有正则逻辑

如果坚持先替换换行,调整正则:

x1$Var <- gsub('\n\n','_',x1$Var)
# 匹配两个连续下划线后到下一个下划线前的内容,修正捕获组引用
x1$Extract <- gsub(".*__([^_]+)_.*", "\\1", x1$Var)

验证结果

运行方案一代码后,x1的Extract列结果:

[1] "Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)"
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)"

x3的Extract列结果:

[1] "Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)"
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)"
[3] "Cadena Echeverría, Jaime Luis Hermel* (ITAM, 2014)"

完全符合预期。

内容的提问来源于stack exchange,提问作者user007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:16:11