Regex для gsub, чтобы соответствовать строке до и через символ новой строки \ n - PullRequest
0 голосов
/ 21 декабря 2018

Попытка построить регулярное выражение для R gsub, чтобы оно соответствовало строке через символ новой строки, которая будет удалена.

Пример строки:

text <- "categories: crime, punishment, france\nTags: valjean, javert,les mis\nAt the end of the day, the criminal Valjean escaped once more."

В идеальном случае gsub заменит первые два блока текста, так что после этого останется только текст.

В концедня преступник Вальжан снова сбежал.

избавившись от категорий и тегов.

Вот схема, с которой я работаю:

^categor*.\n{1}

Этодолжен соответствовать началу строки, все после фрагмента слова, пока он не достигнет первой новой строки, но вместо этого он соответствует только фрагменту.Что я делаю не так?

И есть ли лучший способ, чем два gsub, нокаутировать это?

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018

Нет необходимости использовать [^\n], потому что вы можете использовать просто ., чтобы сопоставить что-либо, кроме символа разрыва строки.Помните, что вам нужно использовать модификатор (?n) с TRE (механизм регулярных выражений по умолчанию с (g)sub / (g)regexpr), а с perl=TRUE это поведение по умолчанию .:

text <- "categories: crime, punishment, france\nTags: valjean, javert,les mis\nAt the end of the day, the criminal Valjean escaped once more."
sub("(?n)^categor(?:.*\n){2}", "", text)
sub("^categor(?:.*\n){2}", "", text, perl=TRUE)

Здесь первые две строки удаляются, если строка начинается с categor.

См. Демонстрационную версию R онлайн .

Сведения о шаблоне

  • ^ - начало привязки строки
  • categor - литеральная подстрока
  • (?:.*\n){2} - ровно 2 последовательных вхождения ({2}) любогоchar, но символы перевода строки (.) ноль или более раз (*), за которыми следует символ LF.
0 голосов
/ 21 декабря 2018

Может быть, следующее регулярное выражение:

sub("^categor.*\\n([^\n]*$)", "\\1", text)
#[1] "At the end of the day, the criminal Valjean escaped once more."
0 голосов
/ 21 декабря 2018

Попробуйте это (новая строка соответствует \\n:

gsub("^categor.*\\n",  "", text)
# [1] "At the end of the day, the criminal Valjean escaped once more."
0 голосов
/ 21 декабря 2018

1) Возникает вопрос, о чем здесь идет речь, поэтому этот первый параметр удаляет первые две строки:

sub("^categor([^\n]*\n){2}", "", text)
## [1] "At the end of the day, the criminal Valjean escaped once more."

Если деталь categor не имеет значенияэто так:

tail(strsplit(text, "\n")[[1]], -2)
## [1] "At the end of the day, the criminal Valjean escaped once more."

2) Если требуется удалить любую строку формы ...:....\n, где символы перед двоеточием в каждой строке должны быть символами слова:

gsub("\\w+:[^\n]+\n", "", text)
## [1] "At the end of the day, the criminal Valjean escaped once more."

или

gsub("\\w+:.+?\n", "", text)
## [1] "At the end of the day, the criminal Valjean escaped once more."

или

grep("^\\w+:", unlist(strsplit(text, "\n")), invert = TRUE, value = TRUE)
## [1] "At the end of the day, the criminal Valjean escaped once more."

3) или если мы хотим удалить строки, имеющие только определенные теги:

gsub("(categories|Tags):.+?\n", "", text)
## [1] "At the end of the day, the criminal Valjean escaped once more."

4) Использование read.dcf также может быть интересно, если вы также хотите захватить теги.

s <- unlist(strsplit(text, "\n"))
ix <- grep("^\\w+:", s, invert = TRUE)
s[ix] <- paste("Content", s[ix], sep = ": ")
out <- read.dcf(textConnection(s))

, предоставив эту матрицу из 3 столбцов:

> out
     categories                  Tags                     
[1,] "crime, punishment, france" "valjean, javert,les mis"
     Content                                                         
[1,] "At the end of the day, the criminal Valjean escaped once more."
...