Я согласен с Андреасом. Теперь, если это одноразовая задача, которую можно разбить на несколько этапов, я бы предложил сначала временно исключить исключения, возможно, используя неиспользуемый в противном случае символ, а затем отложить его позже. Вот находка и замена:
\b(I|God|Dad)\b
@\1
Это дает нам что-то вроде этого (обратите внимание, что я и мой не пишутся с заглавной буквы на английском языке):
Did @I write this to @God, @Dad, or my wife? After a lifetime in the
French diplomatic corps, the Count de Gruse lived with his wife
in an elegant townhouse on Quai Voltaire! He was a likeable man,
cultivated of course, with a well-deserved reputation as a
generous host and an amusing raconteur.
Оттуда вы можете использовать регистрозависимое регулярное выражение и отрицательный взгляд сзади, чтобы найти заглавные слова, перед которыми стоит один или несколько пробелов, не следующих за границей предложения:
(?<![.?'!"])[ ]+[A-Z]
Обратите внимание, что это не сработает для текста, заключенного в твердую оболочку, такого как «французский» в примере, который я показал выше.
Regex может быть довольно хрупким, поэтому что-то вроде этого может потребовать небольшую программу / скрипт, если это не разовая задача. (Или, возможно, макрос.)
Сказав это, вот то, что вы просили, включив также негативные взгляды, чтобы сделать все это за один шаг. :)
(?<![.?'!"]) (?!Dad\b|God\b|I\b)[A-Z]
СОВЕТ: если у вас нет или вы не хотите использовать регистр с учетом регистра, вы можете поставить его в начале регулярного выражения:
(?c)