R 中的 REGEX:从字符串中提取单词

REGEX in R: extracting words from a string

我想这是一个普遍的问题,我找到了很多网页,包括一些来自 SO 的网页,但我无法理解如何实现它。

我是 REGEX 的新手,我想在 R 中使用它来提取句子中的前几个词。

例如,如果我的句子是

z = "I love stack overflow it is such a cool site"

我希望我的输出是(如果我需要前四个词)

[1] "I love stack overflow"

或(如果我需要最后四个字)

[1] "such a cool site"

当然还有下面的作品

paste(strsplit(z," ")[[1]][1:4],collapse=" ")
paste(strsplit(z," ")[[1]][7:10],collapse=" ")

但我想尝试使用正则表达式解决性能问题,因为我需要处理非常大的文件(也是为了了解它)

我查看了几个链接,包括 Regex to extract first 3 words from a stringhttp://osherove.com/blog/2005/1/7/using-regex-to-return-the-first-n-words-in-a-string.html

所以我尝试了

gsub("^((?:\S+\s+){2}\S+).*",z,perl=TRUE)
Error: '\S' is an unrecognized escape in character string starting ""^((?:\S"

我尝试了其他东西,但它通常会返回整个字符串或空字符串。

substr 的另一个问题是它 returns 是一个列表。也许看起来 [[]] 运算符在处理大文件和应用时有点慢(??)。

看起来 R 中使用的语法有些不同? 谢谢!

获取前四个单词。

library(stringr)
str_extract(x, "^\s*(?:\S+\s+){3}\S+")

获得最后四个。

str_extract(x, "(?:\S+\s+){3}\S+(?=\s*$)")

你已经接受了一个答案,但我将分享这个作为帮助你更多地了解 R 中的正则表达式的一种方式,因为你实际上已经非常接近自己得到答案了。


您的 gsub 方法有两个问题:

  1. 您使用了单反斜杠 (\)。 R 要求您转义它们,因为它们是特殊字符。您可以通过添加另一个反斜杠 (\) 来转义它们。如果你这样做 nchar("\"),你会看到它 return 是“1”。

  2. 您没有指定替换内容。在这里,我们不想替换任何东西,但我们想捕获字符串的特定部分。你在括号 (...) 中捕获组,然后你可以通过组的编号来引用它们。在这里,我们只有一组,所以我们将其称为 "\1".

你应该试过类似的东西:

sub("^((?:\S+\s+){2}\S+).*", "\1", z, perl = TRUE)
# [1] "I love stack"

这实际上是在说:

  • 从 "z" 的内容开始工作。
  • 开始创建第 1 组。
  • 查找非空白(如单词)后跟空白 (\S+\s+) 两次 {2},然后是下一组非空白 (\S+)。这将使我们得到 3 个单词,而不会在第三个单词之后得到空格。因此,如果您想要不同数量的单词,请将 {2} 更改为比您实际需要的数字少一个。
  • 到此结束第 1 组。
  • 然后,只是 return 来自 "z" 的第 1 组 (</code>) 的内容。</li> </ul> <hr> <p>要获取最后三个单词,只要调换捕获组的位置,放在模式的末尾即可匹配。</p> <pre><code>sub("^.*\s+((?:\S+\s+){2}\S+)$", "\1", z, perl = TRUE) # [1] "a cool site"