【问题标题】:Find two keywords if they are between 0 and 3 words apart如果两个关键字相隔 0 到 3 个单词,则查找它们
【发布时间】:2022-01-02 19:52:36
【问题描述】:

我想识别具有两个关键字的字符串,它们之间有 0 到 3 个单词。在大多数情况下我的工作:

strings <- c(
  "Today is my birthday",
  "Today is not yet my birthday",
  "Today birthday",
  "Today maybe?",
  "Today: birthday"
)


grepl("Today(\\s\\w+){0,3}\\sbirthday", strings, ignore.case = TRUE)
#> [1]  TRUE FALSE  TRUE FALSE FALSE

reprex package (v2.0.1) 于 2021 年 11 月 24 日创建

我的问题是字符串"Today: birthday"。问题是一个词被定义为(\\s\\w+),没有让句子包含任何标点符号的选项。如何更好地为 word 定义正则表达式,以便不排除标点符号(最好忽略它)。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以使用

    > grepl("Today(\\W+\\w+){0,3}\\W+birthday", strings, ignore.case = TRUE)
    [1]  TRUE FALSE  TRUE FALSE  TRUE
    

    另外,考虑使用单词边界、非捕获组和更稳定的 PCRE 正则表达式引擎:

    grepl("\\bToday(?:\\W+\\w+){0,3}\\W+birthday\\b", strings, ignore.case = TRUE, perl=TRUE)
    

    (?:\W+\w+){0,3}\W+ 部分匹配零到三个出现的一个或多个非单词字符 (\W+),然后是一个或多个单词字符 (\w+),然后是一个或多个非单词字符。

    【讨论】:

    • 太棒了,谢谢。事后看来,这似乎是一个非常明显的解决方案:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多