【问题标题】:R - select nth occurence of regex matchR - 选择第 n 次出现的正则表达式匹配
【发布时间】:2021-01-13 05:29:06
【问题描述】:

我对需要选择字符串的第二个空格的正则表达式模式感到困惑。我已经尝试了谷歌的前 5 页,我想出的只是选择直到第二个空格的所有内容,我只想选择第二个空格本身。

这是我目前所拥有的。

txt <- "the duck is yellow"
str_extract(txt,"(?:[\\w]*)(?:[\\s])(?:[\\w]*)([\\s])")

我尝试的另一个正则表达式是:

(\w+\s\w+\s){2}

我只是无法找到解释如何获得某个字符的第二次出现的来源。我认为这样的事情会很简单。

最终我想在第二个空格处将文本分成两列。

【问题讨论】:

  • 在正则表达式中,通过定义捕获组来获取第二个空格并使用\2 引用第二个组也不错。但是,如果您使用例如tidyr::separate,那将不会对您有太大帮助。相反,我只需将空格处的 separate 分成 3 列(使用 extra = "merge")参数,然后重新组合前两列。
  • 另一个技巧是将第一个空格替换为在您的数据中不太可能出现的特定字符串(例如,"!FIRSTSPACE!"),然后在第一个空格处分隔,然后返回原始通过用空格替换特定字符串。
  • 您可以尝试使用控制动词跳过第一个空格而不使用捕获组:^.*?\s(*SKIP)(*F)|\s
  • 感谢大家的帮助。我使用了下面的 tidyr::extract 方法,效果很好。很高兴能得到一些想法来帮助我跳出框框思考。

标签: r regex tidyr stringr


【解决方案1】:

要将数据分成在第二个空格处拆分的两列,您可以尝试使用tidyr::extract

df <- data.frame(txt = "the duck is yellow")
tidyr::extract(df, txt, c('first', 'second'), '(\\w+\\s\\w+)\\s(.*)')

#     first    second
#1 the duck is yellow

strcapture 使用基础 R :

strcapture('(\\w+\\s\\w+)\\s(.*)', df$txt, 
           proto = list(first = character(), second = character()))

【讨论】:

    【解决方案2】:

    要在第二个空格处拆分单词,我可能建议在这里使用sub

    txt <- "the duck is yellow"
    first <- sub("^(\\w+ \\w+).*$", "\\1", txt)
    second <- sub("^\\w+ \\w+\\s*", "", txt)
    first
    [1] "the duck"
    
    second
    [1] "is yellow"
    

    但是,如果您需要在第 n 个空格处进行拆分,并隐藏在字符串中的某个位置,这种方法可能会变得笨拙。对于更通用的方法,我们可以尝试使用strsplit,然后将这些术语拼凑起来:

    parts <- strsplit(txt, " ")
    pos <- 2
    first <- paste(parts[[1]][1:pos], collapse=" ")                        # "the duck"
    second <- paste(parts[[1]][(pos+1):length(parts[[1]])], collapse=" ")  # "is yellow"
    

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 2022-08-13
      • 2019-07-19
      • 2018-06-28
      相关资源
      最近更新 更多