>>> len('a\\nb') 4 >>> len('a\\nb'.decode('string_escape')) 3 >>> Or for unicode strings >>> len(u'\N{euro sign}\\nB') 4 >>> len(u'\N{euro sign}\\nB'.encode('utf-8').decode('string_escape').decode('utf-8')) 3 This compares to naive approach to decode character escape by writing your own scanner in pure Python. For example: def decode(s): output = [] iterator = iter(s) for c in iterator: if c == '\\': ...enter your state machine and decode... else: output.append(c) return ''.join(output) or def decode(s): return s\ .replace('\\n','\n')\ .replace('\\t','\t')\ ...and so on for the few escapes supported... The navie approaches are expected to be much slower.