使用 R 计算字符串中的单句号和双句号

Count single full stop and double full stops in a String using R

我有一个示例字符串,如下所示

text = "这是一个优先事项。所以..."

我需要计算一个句号出现的次数,以及两个句号和三个句号同时出现的次数。 对于上面的说法,我需要我的回答是:

单个句号的数量:1, 两个加油站的数量:1, 三个句点的计数:1

我使用 R 代码:stringr::str_count(text,"\.\.\.") --> 这让我对连续三个句号的计数为 1,这是正确的

接下来我使用:stringr::str_count(text,"\.\.") --> 这给了我 2 的值,因为另外三组句号同时出现。但我希望此计数为 1,而另一组必须符合 3 个句点的条件。

同样,我需要将单个句号计数为 '1' ,但上面的代码给了我 6,一起计数。我如何在 R 中实现这一点?

提前致谢。

如何在 R 中实现这一点?

您可以使用环视来限定您的句号正则表达式模式,以确保您获得正确的计数:

stringr::str_count(text, "(?<!\.)\.(?!\.)", perl=TRUE)        # number of 1 full stops
stringr::str_count(text, "(?<!\.)\.\.(?!\.)", perl=TRUE)     # number of 2 full stops
stringr::str_count(text, "(?<!\.)\.\.\.(?!\.)", perl=TRUE)  # number of 3 full stops

我们可以将字符转换为原始字符,然后使用 rle:

dots <- rle(charToRaw(x) == 46) 

或者如果首选,则使用 strsplit 等效:

dots <- rle(strsplit(x, '')[[1]] == '.')

然后我们可以使用table得到频率:

table(dots$lengths[dots$values == T])
# 1 2 3 4 
# 2 1 2 1 

示例数据

x = "alksj.lij...lkasjdf.asl;k..aslkd;l....as;lkd..."

以下概括为一行代码中的任意数量的句号。它 returns 一个包含每个句号出现次数的列表。

library(tidyverse)

stops <- 1:3

map(stops, ~str_count(text, paste0("(?<!\.)\.{",.x,"}(?!\.)")))