+def _make_string_matcher(prefix):
+ return re.compile(prefix + r'"(([^"]|\\.)*)"').match
+
+_UNESCAPE_CHARACTERS = {
+ '\\': '\\',
+ '"': '"',
+}
+
+def _unescape_character(ch):
+ return _UNESCAPE_CHARACTERS[ch]
+
+def _unescape(s):
+ characters = []
+ escaping = False
+
+ for ch in s:
+ if escaping:
+ characters.append(_unescape_character(ch))
+ escaping = False
+
+ elif ch == '\\':
+ escaping = True
+
+ else:
+ characters.append(ch)
+
+ return ''.join(characters)
+
+def _make_string_deserializer(tag, prefix):
+ matcher = _make_string_matcher(prefix)
+
+ def deserializer(s):
+ match = matcher(s)
+
+ if match is None:
+ return False, None, None
+
+ result = tags.TaggedObject(
+ tag = tag,
+ instance = _unescape(match.group(1)),
+ )
+
+ return True, result, s[match.end():]
+
+ return deserializer
+