Я получаю информацию об имени из PDF-файла в Python с помощью fitz.
Проблема в том, что большая часть информации имеет пробелы, соответствующие фону, что дает мне, например: имя = «P I E R R E» и фамилия «L E D U C D E C O L».
Мне нужно удалить пробелы между символами, которые не находятся рядом с другим пробелом.
Конечно, сначала я удалил все пробелы с «s/\s//g», но в качестве имени мне дали «LEDUCDECOL», а мне нужно «LE DUC DE COL».
теперь я думаю, что получил то, что ты хотел. чтобы разделить LE DUC DE, используйте v = re.sub(r'(LE|DUC|DE)', r"\1 ", v)
Попробуйте использовать re.sub(' ( ?)', r'\1', s) (также см. эту демонстрацию regex101 ). Он соответствует пробелу и захватывает необязательный пробел в первую группу. Затем захват вставляется в замену (если после пробела был пробел).






# doing it with no loop, just regex
firstname = "P I E R R E"
lastname = "L E D U C D E C O L"
re.sub(r' ', '', firstname) + " " + " ".join([x.replace(" ", "") for x in re.split(r'\s{2}', lastname)])
'PIERRE LE DUC DE COL'
@LetzterWille Я отредактировал вопрос ouzmoutous. Поскольку строка не была отформатирована, двойные пробелы в строке примера L E D U C D E C O L не были видны.
@bobblebubble. Спасибо. Думаю, многих это смутило.
Вы можете сопоставить один пробел , а в повторяющейся группе захвата сопоставить необязательные следующие пробелы, которые сохранят значение последней итерации (один пробел) в группе захвата.
При замене используйте значение группы 1, используя \1
( )*
Если вы хотите сопоставить пробельный символ, вы можете заменить его на \s, но учтите, что он также может соответствовать новой строке:
\s(\s)*
См. демонстрацию регулярных выражений и демонстрацию Python.
Например:
import re
strings = [
"L E D U C D E C O L",
"a b c def g"
]
pattern = r" ( )*"
for s in strings:
print(re.sub(pattern, r"\1", s))
Выход
LE DUC DE COL
a b cdefg
Если вы хотите сопоставить один пробел, за которым не следует другой пробел, вы можете использовать отрицательный просмотр вперед и использовать пустую строку в замене:
(?! )
Посмотрите еще одну демонстрацию регулярных выражений .
Отличный полный ответ, спасибо!
как я могу знать, что это должно быть «LE DUC DE COL», а не «LEDUCDECOL», «LEDU DECOL», «LEDU CDE COL» и т. д.? У вас не может быть регулярного выражения для этого, поскольку у вас, очевидно, есть больше правил, которые регулярное выражение не может выполнить.