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中使用的语法有些不同?谢谢 !
你已经接受了答案,但我将分享这个作为一种帮助你更多地理解R中正则表达式的方法,因为你实际上非常接近自己得到答案.
您的gsub方法有两个问题:
你使用单反斜杠(\).R要求你逃避它们,因为它们是特殊字符.你通过添加另一个反斜杠(\\)来逃避它们.如果你这样做nchar("\\"),你会看到它返回"1".
您没有指定替换应该是什么.在这里,我们不想替换任何东西,但我们想要捕获字符串的特定部分.您可以在括号中捕获组(...),然后可以通过组的编号来引用它们.在这里,我们只有一个组,所以我们将其称为"\\1".
你应该尝试过类似的东西:
sub("^((?:\\S+\\s+){2}\\S+).*", "\\1", z, perl = TRUE)
# [1] "I love stack"
Run Code Online (Sandbox Code Playgroud)
这基本上是说:
\S+\s+)两次{2},然后是下一组非空格(\S+).这将得到3个单词,而不是在第三个单词之后得到空格.因此,如果您想要不同数量的单词,请将{2}其更改为比您实际使用的数字少一个.\1从"z" 返回组1()的内容.要获取最后三个单词,只需切换捕获组的位置并将其放在模式的末尾即可.
sub("^.*\\s+((?:\\S+\\s+){2}\\S+)$", "\\1", z, perl = TRUE)
# [1] "a cool site"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8149 次 |
| 最近记录: |