I am not sure if you can specify all punctuations except '
within a regexp the way you've done. I would check for alphanumerics
+ '
+ space
with negation:
gsub("[^'[:lower:] ]", "", str2) # per Joshua's comment
# [1] "this doesn't not have an apostrophe"