简体   繁体   English

在 R 中提取字符串的特定部分仅适用于某些值

[英]Extract specific part of string in R works only for certain values

I am working with a dataframe of strings in R .我正在使用 R 中的字符串R My dataframe only has one column with a very large string ( dput() added at end of post).我的 dataframe 只有一列带有非常大的字符串( dput()在帖子末尾添加)。 My goal is to extract the text between __ and _ .我的目标是提取___之间的文本。 For that reason I coded next instructions:出于这个原因,我编写了下一条指令:

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

But it only works for the second row and not for the first.但它只适用于第二行而不是第一行。 In my case Extract should be Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19) and Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18) but I am getting:就我而言, Extract应该是Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)但我得到:

[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)" 

Maybe I am wrong with regex .也许我对regex有误。 Many thanks for your help, here is my data:非常感谢您的帮助,这是我的数据:

#Data
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")

New Data:新数据:

#Data 2
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")

We may need to place the __ outside the [] as the character will be literally evaluated as _ (it looks for each unique character within the [] , thus if we have [_] or [__] or [___] or [_____] will all be evaluated as a single _我们可能需要将__放在[]之外,因为该字符实际上会被评估为_ (它会在[] ] 中查找每个唯一字符,因此如果我们有[_][__][___][_____]都将被评估为单个_

> gsub(".*[_]([^.]+)[_].*", "\\1",gsub('\n\n','_',x1$Var))
[1] "Modelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico"
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)" 
> gsub(".*[___]([^.]+)[_].*", "\\1",gsub('\n\n','_',x1$Var))
[1] "Modelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico"
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)"        

If we want to use the _ within the [] , do it as如果我们想在[]中使用_ ,请执行以下操作

> gsub(".*[_]{2}([^_]+)[_].*", "\\1",gsub('\n\n','_',x1$Var))
[1] "Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)" 
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)"

Or can be或者可以是

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

-output -输出

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM