I think this is a difficult question to specify in a precise way, but perhaps this strategy will approximate your goal.
The basic idea is to create a copy of the original string, removing the internally quoted items. An internally quoted item is defined here so that it must contains at least one non-whitespace character.
After the internally quoted items have been removed, you then check whether the entire string needs surrounding quotes or not.
import re
tests = [
# Test data in original question.
( '', '""' ),
( 'a', '"a"' ),
( '"a"', '"a"' ), # No change.
( '""a" b"', '""a" b"' ), # No change.
( '"a" b', '""a" b"' ),
( '"a" "b"', '""a" "b""' ),
( 'a "b" c', '"a "b" c"' ),
# Test data in latest edits.
( 'type', '"type"' ), # Quote these.
( '"type" /?', '""type" /?"' ),
( '"type" "/?"', '""type" "/?""' ),
( 'type "a a" b', '"type "a a" b"' ),
( 'type "" b', '"type "" b"' ),
( '"type"', '"type"' ), # Don't quote.
( '""type" /?"', '""type" /?"' ),
# Some more tests.
( '"a b" "c d"', '""a b" "c d""' ),
( '" a " foo " b "', '"" a " foo " b ""' ),
]
Q = '"'
re_quoted_items = re.compile(r'" \s* [^"\s] [^"]* \"', re.VERBOSE)
for orig, expected in tests:
# The orig string w/o the internally quoted items.
woqi = re_quoted_items.sub('', orig)
if len(orig) == 0:
orig_quoted = Q + orig + Q
elif len(woqi) > 0 and not (woqi[0] == Q and woqi[-1] == Q):
orig_quoted = Q + orig + Q
else:
orig_quoted = orig
print orig_quoted == expected