【问题标题】:Extract n words after a pattern word在模式词之后提取 n 个词
【发布时间】:2021-08-30 15:44:55
【问题描述】:

这是我第一次尝试在 R 中使用 gsub 和正则表达式提取字符串。我想在文本列的每个单元格中第一次出现单词“at”或“around”之后提取三个单词( col)并将提取内容放入新列(new_extract)。

到目前为止,我有以下内容:

df$new_extract <- gsub(".*at(\\w{1,}){3}).*", "\\1", df$col, perl = TRUE)

欢迎任何有关更改/不同方法的建议!

【问题讨论】:

  • 我在下面的回答有帮助吗?

标签: r regex gsub stringr


【解决方案1】:

您的正则表达式仅尝试匹配 last at 之后的单词。此外,由于没有匹配ataround 之间的间隔的模式(顺便说一句,你根本没有尝试匹配around),你的模式最终不会提取任何单词。

我建议使用sub

sub(".*?\\ba(?:t|round)\\W+(\\w+(?:\\W+\\w+){0,2}).*", "\\1", df$col, perl=TRUE)

请参阅regex demo

这里,

  • .*? - 从一开始就匹配,尽可能少的除换行符之外的任何零个或多个字符
  • \ba - 一个单词边界,然后是 a
  • (?:t|round) - tround
  • \W+ - 一个或多个非单词字符
  • (\w+(?:\\W+\\w+){0,2}) - 第 1 组:一个或多个单词字符,然后是零,一或两次出现一个或多个非单词字符,后跟一个或多个单词字符
  • .* - 除换行符以外的任何零个或多个字符尽可能多。

【讨论】:

  • 嗨@wiktor,非常感谢您的回复!如果只有一个模式词(即 at),上述方法会是什么样子?我对正则表达式语法还不是很熟悉,并且很难用一个词来重现它(我知道我最初在我的示例中说了两个模式词,但我试图重现上述更简化的版本并卡住了) .另外,我只想在第一次出现'at'之后提取三个单词,但是当我使用上面的行时,它似乎返回了模式单词之后的所有单词(这可能是用户错误!)。
  • @LunaDeloge 将(?:t|round) 替换为t,参见regex demo。另请参阅this R demo online
  • 这很有效@wiktor - 非常感谢你的帮助!!
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 2021-08-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多