【问题标题】:Regex Expression for Multiple Groups多个组的正则表达式
【发布时间】:2019-09-05 03:43:42
【问题描述】:

这里的文本挖掘菜鸟试图提取各种字符并更新一列。我试过使用 str_extract 但似乎无法处理正则表达式语法。有人可以给我看看吗?谢谢!

可重现的数据

data.frame("name" = c("D1. Hi my name", "A3.3. Hello this is"), "Amount" = c(1, 4))

        name            Amount
1     D1. Hi my name      1
2 A3.3. Hello this is     4

预期输出

        name           Amount New Name       Extracted
1     D1. Hi my name      1     Hi my name      D1.
2 A3.3. Hello this is     4    Hello this is    A3.3.

【问题讨论】:

  • @thelatemail 抱歉,这是我的错误

标签: r regex


【解决方案1】:

我们可以从tidyr 使用extract。在这里,我们通过匹配不是空格 (\\S+) 后跟空格的模式来捕获并捕获第二组字符

library(tidyverse)
df2 %>% 
    extract(name, into = c("Extracted", "NewName"), "^(\\S+) (.*)", 
             remove = FALSE) %>%
     select(names(df1),NewName, Extracted)
#               name Amount       NewName Extracted
#1      D1. Hi my name      1    Hi my name       D1.
#2 A3.3. Hello this is      4 Hello this is     A3.3.

或者使用base R,我们可以用sub创建一个分隔符,然后使用read.csv

cbind(df2, read.csv(text = sub("\\s", ",", df2$name), 
           header = FALSE, col.names = c("Extracted", "NewName")))

【讨论】:

  • 对不起@Akrun,后面有更多空格,因此使用单独可能不起作用
  • @Javier 你能用一个新的例子来更新你的例子,让它变得明显
【解决方案2】:

根据显示的示例,我们可以提取一个字母后跟一个数字以获得Extracted,并删除相同的部分以获得New_Name

library(dplyr)
library(stringr)

df %>%
  mutate(Extracted = str_extract(name, "[A-Z]\\d\\.?\\d?\\."), 
         New_Name = str_remove(name, Extracted))

#                 name Amount Extracted       New_Name
#1      D1. Hi my name      1       D1.     Hi my name
#2 A3.3. Hello this is      4     A3.3.  Hello this is

这也可以集成到tidyr::extract

tidyr::extract(df, name, into = c("Extracted", "New_Name"), 
         regex = "([A-Z]\\d\\.?\\d?\\.)(.*)", remove = FALSE)

【讨论】:

    【解决方案3】:

    上面的第一个答案可能有错误。如果不先将数据转换为 tibble,则无法使用 Jupyter Lab 复制该答案。

    提供的原始数据是:

    > data.frame("name" = c("D1. Hi my name", "A3.3. Hello this is"),
    > "Amount" = c(1, 4))
    

    上面的答案显示:

    > df %>%   mutate(Extracted = str_extract(name, "[A-Z]\\d\\.?\\d?\\."), 
    >          New_Name = str_remove(name, "[A-Z]\\d\\.?\\d?\\."))
    

    但此处显示的带有正则表达式的 mutate 函数会产生错误,并且不提供请求的输出,除非首先将 df 转换为 tibble。

    可以在 Jupyter 中复制并提供所需输出的解决方案如下:

    > df <- tibble("name" = c("D1. Hi my name", "A3.3. Hello this is"),
    > > "Amount" = c(1, 4))
    

    一旦出现 tibble,mutate 和 regex 将执行并提供请求的输出。

    >                  A tibble: 2 × 4
    > <chr>                <dbl>      <chr>       <chr>
    > name                 Amount     Extracted   New_Name   
    > D1.Hi my name        1          D1.         Hi my name  
    > A3.3. Hello this is  4          A3.3.       Hello this is
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-29
      • 2012-11-28
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2012-11-21
      • 2011-06-25
      相关资源
      最近更新 更多