【问题标题】:Matching a specific text with grepl but not the sub-strings of that text使用 grepl 匹配特定文本,但不匹配该文本的子字符串
【发布时间】:2021-02-10 01:24:40
【问题描述】:

我正在尝试使用 grepl() 匹配特定文本,同时确保没有较短的子字符串也返回匹配项。

例如,我希望grepl('liverpool', 'club_futbol_liverpool_fc') 返回TRUE,但我不希望grepl('pool', 'club_futbol_liverpool_fc') 返回TRUE。在这种情况下我不能使用^$,因为我要匹配的文本前后都有字符。写grepl('.*^liverpool$.*', 'club_futbol_liverpool_fc') 也无济于事,我刚刚意识到这与只使用^$ 是一样的。

有没有办法做到这一点?

我应该补充一点,最终目标是在 for 循环中使用这个 grepl() 函数来匹配数据框中的观察结果。不幸的是,liverpool 并不总是被下划线包围,尽管我相信在liverpool 之前或之后总会有至少一个下划线。

【问题讨论】:

  • 使用grepl('(?:\b|_)pool(?:\b|_)', 'club_futbol_liverpool_fc')
  • 感谢您的回答!我应该补充一点,最终目标是在 for 循环中使用这个 grepl() 函数来匹配数据框中的观察结果。不幸的是,liverpool 并不总是被下划线包围,尽管我相信在 'liverpool' 之前或之后总会有至少一个下划线。
  • 什么意思?上面的正则表达式匹配整个单词pool,即使在下划线内,但不需要下划线。发布您的相关代码。

标签: r regex


【解决方案1】:

你可以使用

grepl('(?:\b|_)pool(?:\b|_)', x)
grepl('(?<![^\\W_])pool(?![^\\W_])', x, perl = TRUE)

参见regex demo #1regex demo #2

以上模式的意思

  • (?:\b|_) - 字边界或消耗的 _ 字符
  • (?&lt;![^\W_]) - 字符串中不紧跟字母或数字的位置([^\W_] 匹配除非单词字符和下划线以外的任何字符,即匹配除下划线以外的任何单词字符,有效, 字母或数字)
  • pool - 一句话
  • (?![^\W_]) - 字符串中不紧跟字母或数字的位置。

lookarounds,(?&lt;!...)(?!...) 是非消耗模式,默认的 TRE 正则表达式库不支持它们,因此您需要使用 perl=TRUE 来解析带有 PCRE 正则表达式库的表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2022-11-19
    • 2018-03-06
    • 2011-02-09
    相关资源
    最近更新 更多