使用 gsub 删除模式之后和分号前的文本

Removing text after a pattern and before a semicolon with gsub

提问人:always.learning 提问时间:8/19/2023 最后编辑:r2evansalways.learning 更新时间:8/19/2023 访问量:28

问:

在以下示例中,我想删除 FAPESP 和 CNPq 之后的所有内容并保留其他所有内容:

"105 Group Science; Fundação de Amparo à Pesquisa do Estado de São Paulo, FAPESP, (2015/07311-7, 2018/03211-6); Coordenação de Aperfeiçoamento de Pessoal de Nível Superior, CAPES; Conselho Nacional de Desenvolvimento Científico e Tecnológico, CNPq, (407543/2018-0, 420699/2018-0); Fundação Araucária; Ministry of Science and Technology, Taiwan, MOST"

我需要以下结果:

"105 Group Science; Fundação de Amparo à Pesquisa do Estado de São Paulo, FAPESP; Coordenação de Aperfeiçoamento de Pessoal de Nível Superior, CAPES; Conselho Nacional de Desenvolvimento Científico e Tecnológico, CNPq; Fundação Araucária; Ministry of Science and Technology, Taiwan, MOST"

由于我正在处理大型数据框,因此我无法使用简单的函数(例如,

df$Funding <- gsub(", (2015/07311-7, 2018/03211-6) ", "", df$Funding)
r gsub

评论


答:

1赞 r2evans 8/19/2023 #1

编辑:更简单,

gsub("(FAPESP|CNPq)[^;]*;", "\\1;", have)
# [1] "105 Group Science; Fundação de Amparo à Pesquisa do Estado de São Paulo, FAPESP; Coordenação de Aperfeiçoamento de Pessoal de Nível Superior, CAPES; Conselho Nacional de Desenvolvimento Científico e Tecnológico, CNPq; Fundação Araucária; Ministry of Science and Technology, Taiwan, MOST"
gsub("(FAPESP|CNPq)[^;]*;", "\\1;", have) == want
# [1] TRUE
  • (FAPESP|CNPq)匹配任一子字符串并捕获它
  • [^;]*匹配 0 个或多个非字符,不捕获它们;
  • ;文字分号
  • \\1;将所有先前的匹配项替换为子字符串和文字分号
  • 由于我们使用的是 ,因此对字符串的其余部分重复此操作gsub

由于此数据是分隔的,因此另一种方法是拆分为子组件,在每个关键字后删除(区别较少),然后重新折叠它们。这远不如上述方法有效,但如果/当模式不太清晰时,该方法可能是必要的,或者至少可以简化。使用上述方法,除非简单的正则表达式不起作用。;;

out <- sapply(strsplit(have, ";"), function(s) paste(sub("(FAPESP|CNPq).*", "\\1", s), collapse = ";"))
out
# [1] "105 Group Science; Fundação de Amparo à Pesquisa do Estado de São Paulo, FAPESP; Coordenação de Aperfeiçoamento de Pessoal de Nível Superior, CAPES; Conselho Nacional de Desenvolvimento Científico e Tecnológico, CNPq; Fundação Araucária; Ministry of Science and Technology, Taiwan, MOST"
identical(out, want)
# [1] TRUE
  • strsplit(., ";")通过分号的存在来拆分字符串;它返回一个列表(长度与字符串向量的长度相同),其中每个元素可以是 0+ 长度的字符串向量;
  • 我们用于遍历列表中的每个向量元素,应用子字符串替换sapplysub
  • (FAPESP|CNPq)匹配(并保留)任一字符串
  • .*匹配任何内容(包括任何内容),它不会被收集
  • 一起,匹配子字符串及其后面的所有内容(每个分隔字符串),并将其替换为子字符串(通过"(FAPESP|CNPq).*";"\\1")
  • paste(., collapse = ";")将字符串还原为 -delimited 字符串;

我认为这意味着您需要修复的代码是df$Funding

df$Funding <-
  sapply(strsplit(df$Funding, ";"),
         function(s) paste(sub("(FAPESP|CNPq).*", "\\1", s), collapse = ";"))

我们也可以使用,但这种模式的细节不需要它的叶性质。gsubg


数据

have <- "105 Group Science; Fundação de Amparo à Pesquisa do Estado de São Paulo, FAPESP, (2015/07311-7, 2018/03211-6); Coordenação de Aperfeiçoamento de Pessoal de Nível Superior, CAPES; Conselho Nacional de Desenvolvimento Científico e Tecnológico, CNPq, (407543/2018-0, 420699/2018-0); Fundação Araucária; Ministry of Science and Technology, Taiwan, MOST"
want <- "105 Group Science; Fundação de Amparo à Pesquisa do Estado de São Paulo, FAPESP; Coordenação de Aperfeiçoamento de Pessoal de Nível Superior, CAPES; Conselho Nacional de Desenvolvimento Científico e Tecnológico, CNPq; Fundação Araucária; Ministry of Science and Technology, Taiwan, MOST"

评论

0赞 r2evans 8/19/2023
@AriAlex,一定要看看我的编辑,一个更快的(呃,应该先尝试一下)的表情。
0赞 always.learning 8/19/2023
伟大!谢谢你@r2evans。