Регистрозависимая замена переноса регулярным выражением - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь очистить текст в R с помощью ввода на немецком языке.

library(tidyverse)
bye_bye_hyphenation <- function(x){
  # removes words separated by hyphenation f.e. due to PDF input
  # eliminate line breaks
  # first group for characters (incl. European ones) (\\1), dash and following whitespace,
  # second group for characters (\\2) (incl. European ones)
  stringr::str_replace_all(x, "([a-z|A-Z\x7f-\xff]{1,})\\-[\\s]{1,}([a-z|A-Z\x7f-\xff]{1,})", "\\1\\2")
}

# this works correctly
"Ex-\n ample" %>% 
  bye_bye_hyphenation()
#> [1] "Example"

# this should stay the same, `Regierungsund` should not be
# concatenated
"Regierungs- und Verwaltungsgesetz" %>%
  bye_bye_hyphenation()
#> [1] "Regierungsund Verwaltungsgesetz"

Создано в 2019-06-19 с помощью пакета Представить (v0.3.0)

Кто-нибудь знает, как это сделатьВесь регистр чувствителен к регистру, так что он не будет срабатывать во втором случае, то есть всякий раз, когда слово und появляется после тире и пробела?

1 Ответ

2 голосов
/ 19 июня 2019

Возможно, вы могли бы использовать отрицательные или положительные взгляды (см., Например, Regex lookahead, lookbehind и atomic groups ). Приведенное ниже регулярное выражение удаляет дефис, за которым следует потенциальный разрыв строки или пробел, если оно равно , а не , за которым следует слово "und", а в противном случае удаляет только разрыв строки:

library(stringr)

string1 <- "Ex- ample"
string2 <- "Ex-\n ample"
string3 <- "Regierungs- und Verwaltungsgesetz"
string4 <- "Regierungs-\n und Verwaltungsgesetz"

pattern <- "(-\\n?\\s?(?!\\n?\\s?und))|(\\n(?=\\s?und))"

str_remove(string1, pattern)
#> [1] "Example"
str_remove(string2, pattern)
#> [1] "Example"
str_remove(string3, pattern)
#> [1] "Regierungs- und Verwaltungsgesetz"
str_remove(string4, pattern)
#> [1] "Regierungs- und Verwaltungsgesetz"

Создан в 2019-06-19 пакетом представ. (v0.3.0)

...