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

Fag*_*ain 6 regex string r extract

我想这是一个常见的问题,我发现了很多网页,包括一些来自SO,但我不明白如何实现它.

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

例如,如果我的判决是

z = "I love stack overflow it is such a cool site"
Run Code Online (Sandbox Code Playgroud)

我喜欢把我的输出作为(如果我需要前四个单词)

[1] "I love stack overflow"
Run Code Online (Sandbox Code Playgroud)

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

[1] "such a cool site"
Run Code Online (Sandbox Code Playgroud)

当然,以下作品

paste(strsplit(z," ")[[1]][1:4],collapse=" ")
paste(strsplit(z," ")[[1]][7:10],collapse=" ")
Run Code Online (Sandbox Code Playgroud)

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

我看了几个链接,包括 Regex从字符串中提取前3个单词http://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"
Run Code Online (Sandbox Code Playgroud)

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

substr的另一个问题是它返回一个列表.也许看起来[[]]操作员在处理大文件和应用东西时会慢一点(??).

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

A5C*_*2T1 6

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


您的gsub方法有两个问题:

  1. 你使用单反斜杠(\).R要求你逃避它们,因为它们是特殊字符.你通过添加另一个反斜杠(\\)来逃避它们.如果你这样做nchar("\\"),你会看到它返回"1".

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

你应该尝试过类似的东西:

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

这基本上是说:

  • 从"z"的内容开始工作.
  • 开始创建组1.
  • 找到非空格(如单词),然后是whitespace(\S+\s+)两次{2},然后是下一组非空格(\S+).这将得到3个单词,而不是在第三个单词之后得到空格.因此,如果您想要不同数量的单词,请将{2}其更改为比您实际使用的数字少一个.
  • 在那里结束组1.
  • 然后,只需\1从"z" 返回组1()的内容.

要获取最后三个单词,只需切换捕获组的位置并将其放在模式的末尾即可.

sub("^.*\\s+((?:\\S+\\s+){2}\\S+)$", "\\1", z, perl = TRUE)
# [1] "a cool site"
Run Code Online (Sandbox Code Playgroud)