【问题标题】:How do I split a complex string using regex or string manipulation?如何使用正则表达式或字符串操作拆分复杂的字符串?
【发布时间】:2023-02-23 14:49:33
【问题描述】:

我有一个配料表如下:

Ingredients <- "Starch (Corn | Potato | Wheat) | Vegetables (27%) [Pea (23%) (Flakes | Pieces) | Carrot Pieces | Onion Powder | Spinach Powder] | Croutons (10%) (Wheat Flour | Vegetable Oil | Salt | Yeast) | Maltodextrin | Natural Flavours (Contain Milk and Soybeans) | Creamer [Contains Milk | Mineral Salts (339 or 340 | 450 or 451)] | Salt | Mineral Salt (Potassium Chloride) | Sugar | Flavour Enhancer (621) | Vegetable Oil | Bacon Powder (0.5%) | Parsley | Natural Colour (Turmeric) | Burnt Sugar | Food Acid (Lactic) | Pepper Extract"

我想将它们分成变量ingredients 下数据框中的值。

但是我在编写代码时遇到了问题,因为列表中以各种方式使用了分隔符|。所以我想在 | 上拆分,它不包含在方括号 () 或方括号 [] 中。并且真的不知道如何处理这个问题。

也就是说,我们最终会得到一个成分值 Starch (Corn | Potato | Wheat) 和另一个 Vegetables (27%) [Pea (23%) (Flakes | Pieces) | Carrot Pieces | Onion Powder | Spinach Powder] 以及另一个只是 Salt (加上其他成分,但前两个对我来说是更棘手的情况)。

【问题讨论】:

    标签: r regex string


    【解决方案1】:

    正则表达式修改自this answer

    这个想法是首先将括号(()[])之间的| 字符替换为其他字符(在我的示例中为@)。剩余的 | 字符应该是字符串的真正分隔符。然后使用strsplit拆分|并将@符号替换回|。最后,trims() 删除每个字符串末尾不需要的空格。

    library(dplyr)
    
    strsplit(gsub("\|(?=[^()]*\))", "@", Ingredients, perl=TRUE) %>% 
               gsub("\|(?=[^\[\]]*\])", "@", ., perl=TRUE), "\|") %>% 
      unlist() %>% 
      gsub("@", "\|", .) %>% 
      trimws()
    
     [1] "Starch (Corn | Potato | Wheat)"                                                                
     [2] "Vegetables (27%) [Pea (23%) (Flakes | Pieces) | Carrot Pieces | Onion Powder | Spinach Powder]"
     [3] "Croutons (10%) (Wheat Flour | Vegetable Oil | Salt | Yeast)"                                   
     [4] "Maltodextrin"                                                                                  
     [5] "Natural Flavours (Contain Milk and Soybeans)"                                                  
     [6] "Creamer [Contains Milk | Mineral Salts (339 or 340 | 450 or 451)]"                             
     [7] "Salt"                                                                                          
     [8] "Mineral Salt (Potassium Chloride)"                                                             
     [9] "Sugar"                                                                                         
    [10] "Flavour Enhancer (621)"                                                                        
    [11] "Vegetable Oil"                                                                                 
    [12] "Bacon Powder (0.5%)"                                                                           
    [13] "Parsley"                                                                                       
    [14] "Natural Colour (Turmeric)"                                                                     
    [15] "Burnt Sugar"                                                                                   
    [16] "Food Acid (Lactic)"                                                                            
    [17] "Pepper Extract" 
    

    【讨论】:

      【解决方案2】:

      您可以使用递归正则表达式:

      pat <- r"(([^[]|]*[[(](?:[^[)(]]*(?1)?)+[])])| ([^|]+))"
      regmatches(Ingredients, gregexpr(pat, Ingredients, perl = TRUE))
      
      [[1]]
       [1] "Starch (Corn | Potato | Wheat)"                                                                 
       [2] " Vegetables (27%) [Pea (23%) (Flakes | Pieces) | Carrot Pieces | Onion Powder | Spinach Powder]"
       [3] " Croutons (10%) (Wheat Flour | Vegetable Oil | Salt | Yeast)"                                   
       [4] " Maltodextrin "                                                                                 
       [5] " Natural Flavours (Contain Milk and Soybeans)"                                                  
       [6] " Creamer [Contains Milk | Mineral Salts (339 or 340 | 450 or 451)]"                             
       [7] " Salt "                                                                                         
       [8] " Mineral Salt (Potassium Chloride)"                                                             
       [9] " Sugar "                                                                                        
      [10] " Flavour Enhancer (621)"                                                                        
      [11] " Vegetable Oil "                                                                                
      [12] " Bacon Powder (0.5%)"                                                                           
      [13] " Parsley "                                                                                      
      [14] " Natural Colour (Turmeric)"                                                                     
      [15] " Burnt Sugar "                                                                                  
      [16] " Food Acid (Lactic)"                                                                            
      [17] " Pepper Extract"        
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2015-08-22
        • 2016-12-11
        • 2011-12-20
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多