I'm not certain I'm entirely following. In your pseudo-regex:
Code:
(?<=\bI)[non-space, non-character](?=m\b)
You seem to want to match the position in between Im (with word boundaries on either side) so you can replace that captured "position" with an apostrophe. But if you're basically going to run a search for "Im"... then why not just replace all instances of \bIm\b with "I'm". Or \b((?i)c)(?-i)ant\b with "\1an't" ? Shouldn't take too long to go through most of the common contractions.