#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:]]
Комментарии:
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)