提取模式之间的多个字符串块

问题描述 投票:0回答:2

这篇文章询问如何在 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
工作。

r stringr string-matching
2个回答
1
投票

我们可以如下使用

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:
    跟随

0
投票

您可以

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"
© www.soinside.com 2019 - 2024. All rights reserved.