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

vm0i2vca  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(325)

这篇文章询问如何在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”和“农产品知名制造商”。
基于上面的帖子,这个代码

gsub(".*Fabricante: *(.+) CNPJ:.*", "\\1", df$manufacturing_location[92])

返回最后一个匹配项“NOVAMED FABRICAÇAO DE PRODUTOS FARMACEUTICOS”。
当我变成

gsub(".*Fabricante: *(.*?) CNPJ:.*", "\\1", df$manufacturing_location[92])

它返回第一个。我尝试更改为\\2,因为我认为这将编号出现,但随后我得到了一个空字符串。我还尝试使用stringrstr_match_all,但它也不起作用。
有人知道如何调整语法,以便我可以泰勒的代码返回每一个需要的三个?
我想把它放到一个mutate语法中,这样我就可以把它传递到一个包含许多这样的字符串的数据集上,并把第一个、第二个和第三个条目作为变量返回。

yftpprvb

yftpprvb1#

我们可以按如下方式使用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: )向后查找并AssertFabricante:优先于
  • .*?然后匹配所有内容,直到达到最近的
  • (?= CNPJ:)先行并AssertCNPJ:跟随
2wnc66cl

2wnc66cl2#

您可以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"
xlpyo6sf

xlpyo6sf3#

您的数据似乎是debian控制文件格式,您可以在添加换行符后使用base R中的read.dcf,然后您可以访问您想要的任何数据列。

read.dcf(textConnection(gsub("(Fabricante)","\n\\1",gsub(" (\\S+:)", "\n\\1", x))),all = TRUE)
                                         Fabricante                 CNPJ                                     Endereço Fabricaçao
1                                           EMS S/A - 57.507.378/0001-01 SAO BERNARDO DO CAMPO - SP - BRASIL Etapa de           
2                                           EMS S/A - 57.507.378/0003-65           HORTOLANDIA - SP - BRASIL Etapa de           
3 NOVAMED FABRICAÇAO DE PRODUTOS FARMACEUTICOS LTDA - 12.424.020/0001-79                MANAUS - AM - BRASIL Etapa de

---故障:

gsub(" *(\\S+:)", "\n\\1", x) |> #Every keyword needs to start a new line 
  gsub("(Fabricante)", "\n\\1", x=_) |> #Every row data separated from the previous
  textConnection() |> #  Convert to a file readable object
  read.dcf(all =TRUE) # Read into R

相关问题