убрать перенос в конце строки только регулярное выражение python r

#python #r #regex

#python #r #регулярное выражение

Вопрос:

У меня есть куча файлов PDF (текстовых и отсканированных) для чтения текста. В некоторых случаях длинное слово переносится через дефис в конце строки. Пример текста прилагается:

пример

Мне нужно убрать эти дефисы, когда они находятся только в конце строки. То есть я хочу сохранить все знаки препинания и дефисы, в противном случае. Итак, в этом примере The-example-text должно остаться как есть, но после очистки разрыва строки и дефиса я хочу получить Persönlichkeit , Gemeinschaft и Fähigkeiten без дефисов и без пустых пробелов вместо дефиса.

Что я делаю в R, так это:

 gsub("-nn|-n|- n", "", txt)
  

Но это работает не всегда.
Каков элегантный способ сделать это?

Ответ №1:

Вы могли бы попробовать разобраться gsubfn::gsubfn , соединяет ли дефис два слова или просто переносит одно:

 gsubfn(pattern = "-\n\s*[A-Z]?", replacement = function(x) {
  if (grepl(pattern = "[A-Z]", x = x)) {
    gsub("\n\s?|\n\s ", "", x)
  } else {
    gsub("-\n\s?", "", x)
  }
}, x = x)
  

Ответ №2:

Это сделает это за вас:

 -s*$s 
  
  • -s*$ — захват a - с необязательным пробелом в конце строки
  • s — захват любых пробелов (включая новые строки) после тире

При замене просто замените на пустую строку.

Если приведенное выше несовместимо с R, то это должно быть за http://www.endmemo.com/r/gsub.php:

 -[[:space:]]*$[[:space:]] 
  

https://regex101.com/r/hTaKYC/1

Комментарии:

1. В R, я не думаю s , что распознается, вероятно, следует заменить на -[:blank:]*$

2. почему o вам нужно вводить s символьный класс?

3. @Onyambu Неудачное редактирование, раньше так и было [rn] . Однако это исправлено…

4. @Alexlok yes s распознается в R. R использует POXIS движок по умолчанию, а также использует PCRE , когда пользователь заявляет об этом. Единственная проблема в том, что вам нужно избегать обратной косой черты, как и во многих других языках.

5. @Alexlok python помечен, поэтому я предположил, что это будет нормально.

Ответ №3:

Вы можете попробовать это

 import re

# replace all '-n','- n', '-  n', '-nn'
result = re.sub(r'- *n ','', text)
  

Ответ №4:

Удалите любой дефис, за которым следуют необязательные пробелы, а затем любое количество окончаний строк:

 gsub("-\h*\R ", "", txt, perl=TRUE)
library(stringr)
stringr::str_replace_all(txt, "-\h*\R ", "")
  

Смотрите доказательство.

Объяснение

 --------------------------------------------------------------------------------
  -                        '-'
--------------------------------------------------------------------------------
  h*                      horizontal whitespace, 0 or more times
--------------------------------------------------------------------------------
  R                       any line ending (1 or more times)