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 |
你可以这样做:
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)
您可以使用稍微缩短的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
忽略这些匹配的字符,然后,
匹配用于分割字符串的逗号。