正则表达式查找每两个逗号,使用 dplyr 将行与列分开

And*_*lgo 2 regex r separator dataframe dplyr

我有这样的字符串:

71,72,80,81,102,100
Run Code Online (Sandbox Code Playgroud)

我想分隔每 2 个“数字”,所以:

71,72
80,81
102,100
Run Code Online (Sandbox Code Playgroud)

我写了这个正则表达式:

(([0-9]{1,4}),([0-9]{1,4}))
Run Code Online (Sandbox Code Playgroud)

其中突出显示了我需要的组,除了“,”之间的逗号

在我的代码中我使用 dplyr

例子:

df_example <- tibble(Lotes= "LOT1,LOT2,LOT3",NoModuloPlastico = "71,72,80,81,102,100")

df_result_example <- df_example %>%
separate_rows(c(Lotes),sep=",") %>%
separate_rows(c(NoModuloPlastico),sep="(([0-9]{1,3}),([0-9]{1,3}))")
Run Code Online (Sandbox Code Playgroud)

这意味着我真正需要的是用正则表达式突出显示每 2 个逗号,但我找不到方法。

我无法根据我的需要调整这些链接:

https://bedigit.com/blog/regex-how-to-match-everything-except-a-particular-pattern/

https://blog.codinghorror.com/ exclude-matches-with-regular-expressions/

我得到的:

洛特 无模塑料
批次 1 “”
批次 1 “,”
批次 1 “,”
批次 1 “”
批次2 “”
批次2 “,”
批次2 “,”
批次2 “”
LOT3 “”
LOT3 “,”
LOT3 “,”
LOT3 “”

我想要的是:

洛特 无模塑料
批次 1 71,72
批次2 80,81
LOT3 102,100

Ony*_*mbu 8

你可以这样做:

df_example %>%
  mutate(Lotes = str_split(Lotes, ','),
         NoModuloPlastico = NoModuloPlastico %>%
           str_replace_all('([^,]+,[^,]+),', '\\1:') %>%
           str_split(':')) %>%
  unnest(everything())

# A tibble: 3 x 2
  Lotes NoModuloPlastico
  <chr> <chr>           
1 LOT1  71,72           
2 LOT2  80,81           
3 LOT3  102,100
Run Code Online (Sandbox Code Playgroud)

  • 一如既往的鼓舞人心:)不过已经投票了。 (3认同)

Wik*_*żew 5

您可以使用稍微缩短的Onyambu 解决方案

df_example %>% 
  mutate(Lotes = strsplit(Lotes, ','),
    NoModuloPlastico = NoModuloPlastico %>% 
      strsplit('[^,]*,[^,]*\\K,', perl=TRUE)) %>% 
  unnest(everything())
Run Code Online (Sandbox Code Playgroud)

输出:

# A tibble: 3 x 2
  Lotes NoModuloPlastico
  <chr> <chr>           
1 LOT1  71,72           
2 LOT2  80,81           
3 LOT3  102,100 
Run Code Online (Sandbox Code Playgroud)

注意事项

  • strsplit(Lotes, ',')Lotes用逗号分隔列
  • strsplit('[^,]*,[^,]*\\K,', perl=TRUE)NoModuloPlastico将列与其他逗号分开。[^,]*,[^,]*匹配零个或多个非逗号字符,一个逗号和零个或多个非逗号字符,\K忽略这些匹配的字符,然后,匹配用于分割字符串的逗号。

  • 这太棒了亲爱的维克托:) (2认同)