Мне нужно посчитать строки из 221 стихотворения, и я попытался подсчитать разрывы строк \n.
Однако некоторые строки имеют двойной разрыв строки \n\n для создания нового стиха. Я хочу, чтобы они считались как один. Количество и положение двойных разрывов строк в каждом стихотворении случайны.
Минимальный рабочий пример:
library("quanteda")
poem1 <- "This is a line\nThis is a line\n\nAnother line\n\nAnd another one\nThis is the last one"
poem2 <- "Some poetry\n\nMore poetic stuff\nAnother very poetic line\n\nThis is the last line of the poem"
poems <- quanteda::corpus(poem1, poem2)
Результирующее количество строк должно быть 5 строк для poem1
и 4 строки для poem2
.
Я пробовал stringi::stri_count_fixed(texts(poems), pattern = "\n")
, но шаблон регулярного выражения недостаточно сложен, чтобы учесть проблему случайного двойного разрыва строки.
Но \n\n следует считать только одним
Но вы не должны использовать функцию _fixed
с регулярным выражением. Должно быть stringi::stri_count_regex
. Или stringr::str_count
Вы можете использовать stringr::str_count
с шаблоном \R+
, чтобы найти количество последовательных последовательностей разрыва строки в строке:
> poem1 <- "This is a line\nThis is a line\n\nAnother line\n\nAnd another one\nThis is the last one"
> poem2 <- "Some poetry\n\nMore poetic stuff\nAnother very poetic line\n\nThis is the last line of the poem"
> library(stringr)
> str_count(poem1, "\\R+")
[1] 4
> str_count(poem2, "\\R+")
[1] 3
Таким образом, количество строк равно str_count(x, "\\R+") + 1
.
Шаблон \R
соответствует любой последовательности разрыва строки, CRLF, LF или CR. \R+
соответствует последовательности из одной или нескольких таких последовательностей разрыва строки.
Смотрите R code DEMO онлайн:
poem1 <- "This is a line\nThis is a line\n\nAnother line\n\nAnd another one\nThis is the last one"
poem2 <- "Some poetry\n\nMore poetic stuff\nAnother very poetic line\n\nThis is the last line of the poem"
library(stringr)
str_count(poem1, "\\R+")
# => [1] 4
str_count(poem2, "\\R+")
# => [1] 3
## Line counts:
str_count(poem1, "\\R+") + 1
# => [1] 5
str_count(poem2, "\\R+") + 1
# => [1] 4
Спасибо за объяснение обоснования вашего ответа, я был рад узнать о совпадении разрыва строки с \R.
Нет, используйте
"\\R+"
, он соответствует любой одной или нескольким последовательностям разрыва строки как одно совпадение.