Чтобы удалить целых слов , вы хотите использовать \b
граничные привязки, чтобы не совпадать с частичным словом.Чтобы удалить слова, которым предшествует пунктуация, вы можете использовать отрицательный вид сзади, при условии , что между пунктуацией и первой буквой всегда есть фиксированное количество пробелов.
Я собираюсьпредположить, что между пунктуацией и следующей буквой всегда есть один пробел.Вы всегда можете сначала нормализовать ввод, заменив несколько пробелов одним пробелом.
Это заставит регулярное выражение удалить следующие слова:
\b(?<![!?.]\s)[A-Z][a-z]*(?:'s)?\b
и демо:
>>> import re
>>> myString='The name of her company is Water Company WC 123 WaTerCompany! She was going to meet Daniel. Why? Because Daniel is her boy friend. Patricia? The daughter of Susana! Look, Daniel\'s car is white'
>>> regex = r'\b(?<![!?.]\s)[A-Z][a-z]*(?:'s)?\b'
>>> re.sub(regex, " ", myString)
' name of her company is WC 123 WaTerCompany! She was going to meet . Why? Because is her boy friend. Patricia? The daughter of ! Look, car is white'
или попробуйте шаблон онлайн, на regex101 .