Я погоджуюся з Андреасом. Тепер, якщо це одноразове завдання, яке ви можете розділити на кілька етапів, я б запропонував тимчасово виключити винятки, ймовірно, використовуючи інакше невикористаний символ, а потім повернути його пізніше. Ось знахідка та заміна:
\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)