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 string 和
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"
我尝试了其他东西,但它通常会返回整个字符串或空字符串。
substr 的另一个问题是它 returns 是一个列表。也许看起来 [[]]
运算符在处理大文件和应用时有点慢(??)。
看起来 R 中使用的语法有些不同?
谢谢!
获取前四个单词。
library(stringr)
str_extract(x, "^\s*(?:\S+\s+){3}\S+")
获得最后四个。
str_extract(x, "(?:\S+\s+){3}\S+(?=\s*$)")
你已经接受了一个答案,但我将分享这个作为帮助你更多地了解 R 中的正则表达式的一种方式,因为你实际上已经非常接近自己得到答案了。
您的 gsub
方法有两个问题:
您使用了单反斜杠 (\
)。 R 要求您转义它们,因为它们是特殊字符。您可以通过添加另一个反斜杠 (\
) 来转义它们。如果你这样做 nchar("\")
,你会看到它 return 是“1”。
您没有指定替换内容。在这里,我们不想替换任何东西,但我们想捕获字符串的特定部分。你在括号 (...)
中捕获组,然后你可以通过组的编号来引用它们。在这里,我们只有一组,所以我们将其称为 "\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"
我想这是一个普遍的问题,我找到了很多网页,包括一些来自 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 string 和 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"
我尝试了其他东西,但它通常会返回整个字符串或空字符串。
substr 的另一个问题是它 returns 是一个列表。也许看起来 [[]]
运算符在处理大文件和应用时有点慢(??)。
看起来 R 中使用的语法有些不同? 谢谢!
获取前四个单词。
library(stringr)
str_extract(x, "^\s*(?:\S+\s+){3}\S+")
获得最后四个。
str_extract(x, "(?:\S+\s+){3}\S+(?=\s*$)")
你已经接受了一个答案,但我将分享这个作为帮助你更多地了解 R 中的正则表达式的一种方式,因为你实际上已经非常接近自己得到答案了。
您的 gsub
方法有两个问题:
您使用了单反斜杠 (
\
)。 R 要求您转义它们,因为它们是特殊字符。您可以通过添加另一个反斜杠 (\
) 来转义它们。如果你这样做nchar("\")
,你会看到它 return 是“1”。您没有指定替换内容。在这里,我们不想替换任何东西,但我们想捕获字符串的特定部分。你在括号
(...)
中捕获组,然后你可以通过组的编号来引用它们。在这里,我们只有一组,所以我们将其称为"\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"