Я думаю, что это сложный вопрос для точного определения, но, возможно, эта стратегия будет приближаться к вашей цели.
Основная идея заключается в создании копии исходной строки, удалив внутренне заключенных в кавычки элементов . Здесь определяется элемент, заключенный в кавычки, так что он должен содержать хотя бы один непробельный символ.
После удаления внутренних элементов в кавычках вы затем проверяете, нуждается ли вся строка в кавычках или нет.
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