提问人:always.learning 提问时间:8/19/2023 最后编辑:r2evansalways.learning 更新时间:8/19/2023 访问量:28
使用 gsub 删除模式之后和分号前的文本
Removing text after a pattern and before a semicolon with gsub
问:
在以下示例中,我想删除 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)
答:
编辑:更简单,
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+ 长度的字符串向量;- 我们用于遍历列表中的每个向量元素,应用子字符串替换
sapply
sub
(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 = ";"))
我们也可以使用,但这种模式的细节不需要它的叶性质。gsub
g
数据
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"
评论