这篇文章询问如何在 R 中的其他两个字符串之间提取字符串:Extracting a string between other two strings in R
我正在寻找类似的答案,但现在涵盖模式之间的多次出现。
示例字符串:
Fabricante: EMS S/A CNPJ: - 57.507.378/0001-01 Endereço: SAO BERNARDO DO CAMPO - SP - BRASIL Etapa de Fabricaçao: Fabricante: EMS S/A CNPJ: - 57.507.378/0003-65 Endereço: HORTOLANDIA - SP - BRASIL Etapa de Fabricaçao: Fabricante: NOVAMED FABRICAÇAO DE PRODUTOS FARMACEUTICOS LTDA CNPJ: - 12.424.020/0001-79 Endereço: MANAUS - AM - BRASIL Etapa de Fabricaçao:
在每次出现“Fabricante”和“CNPJ”这两个词之间,都有一个公司名称,我想将其提取出来。在这个字符串中,有三个这样的公司:“EMS S/A”、“EMS S/A”和“NOVAMED FABRICAÇAO DE PRODUTOS FARMACEUTICOS”。
基于上面的帖子,这段代码
gsub(".*Fabricante: *(.+) CNPJ:.*", "\\1", df$manufacturing_location[92])
返回最后一次出现,“NOVAMED FABRICAÇAO DE PRODUTOS FARMACEUTICOS”。
当我变成
gsub(".*Fabricante: *(.*?) CNPJ:.*", "\\1", df$manufacturing_location[92])
它返回第一个。我尝试更改为
\\2
,因为我认为这会出现很多次,但后来我得到一个空字符串。我也尝试过使用stringr
的str_match_all
,但它也没有用。
任何人都知道如何调整语法,以便我可以根据需要编写代码以返回这三个中的每一个?
我想将其放入
mutate
语法中,我可以将其传递到具有许多此类字符串的数据集,并将第一个、第二个和第三个条目作为变量返回。为此,我发现我无法使str_match_all
工作。
我们可以如下使用
str_match_all
:
x <- "Fabricante: EMS S/A CNPJ: - 57.507.378/0001-01 Endereço: SAO BERNARDO DO CAMPO - SP - BRASIL Etapa de Fabricaçao: Fabricante: EMS S/A CNPJ: - 57.507.378/0003-65 Endereço: HORTOLANDIA - SP - BRASIL Etapa de Fabricaçao: Fabricante: NOVAMED FABRICAÇAO DE PRODUTOS FARMACEUTICOS LTDA CNPJ: - 12.424.020/0001-79 Endereço: MANAUS - AM - BRASIL Etapa de Fabricaçao:"
matches <- str_match_all(x, "(?<=\\bFabricante: ).*?(?= CNPJ:)")[[1]]
matches
[,1]
[1,] "EMS S/A"
[2,] "EMS S/A"
[3,] "NOVAMED FABRICA<U+00C7>AO DE PRODUTOS FARMACEUTICOS LTDA"
这里是对正在使用的正则表达式模式的解释:
(?<=\\bFabricante: )
回顾并断言Fabricante:
先于.*?
然后匹配所有内容,直到到达最近的(?= CNPJ:)
向前看并断言 CNPJ:
跟随您可以
strsplit
在关键字和子集到所需的元素。
el(strsplit(x, '\\s?\\w*:\\s+'))[c(2, 6, 10)]
# [1] "EMS S/A" "EMS S/A"
# [3] "NOVAMED FABRICAÇAO DE PRODUTOS FARMACEUTICOS LTDA"