Это сложная проблема, но один из подходов, который может помочь вам в этом, заключается в использовании негативных и позитивных lookbehinds / lookaheads для кодирования нескольких основных правил.
Следующий пример, вероятно, будет работать хорошодостаточно, учитывая то, что вы описали.Он будет неправильно объединять символы из последовательных «настоящих» слов, которые были разбиты на отдельные символы, но если это случится редко, это, вероятно, будет хорошо.Вы можете добавить дополнительные правила, чтобы охватить больше краевых случаев.
import re
import pandas as pd
s = pd.Series(['V e r y calm', 'Keen and a n a l y t i c a l',
'R a s h and careless', 'Always joyful'])
regex = re.compile('(?<![a-zA-Z]{2})(?<=[a-zA-Z]{1}) +(?=[a-zA-Z] |.$)')
s.str.replace(regex, '')
0 Very calm
1 Keen and analytical
2 Rash and careless
3 Always joyful
dtype: object
Это регулярное выражение эффективно говорит:
Ищите последовательности пробелов и заменяйте пробелы, но только если перед ними одна буква.Если есть две буквы, ничего не делайте (т.е. двухбуквенное слово).Но, в частности, фактически заменяйте пробел только в том случае, если после последнего пробела в последовательности есть буква или любой символ, заканчивающий строку.