Reversing Python's re.escape
--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Horror Game Menu Looping
--
Chapters
00:00 Reversing Python'S Re.Escape
00:44 Accepted Answer Score 10
01:30 Thank you
--
Full question
https://stackoverflow.com/questions/4366...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #regex #python3x #escaping
#avk47
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Horror Game Menu Looping
--
Chapters
00:00 Reversing Python'S Re.Escape
00:44 Accepted Answer Score 10
01:30 Thank you
--
Full question
https://stackoverflow.com/questions/4366...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #regex #python3x #escaping
#avk47
ACCEPTED ANSWER
Score 10
So is this really the only thing that works?
>>> re.sub(r'\\(.)', r'\1', re.escape(' ')) ' '
Yes. The source for the re module contains no unescape() function, so you're definitely going to have to write one yourself.
Furthermore, the re.escape() function uses str.translate() …
def escape(pattern):
"""
Escape special characters in a string.
"""
if isinstance(pattern, str):
return pattern.translate(_special_chars_map)
else:
pattern = str(pattern, 'latin1')
return pattern.translate(_special_chars_map).encode('latin1')
… which, while it can transform a single character into multiple characters (e.g. [ → \[), cannot perform the reverse of that operation.
Since there's no direct reversal of escape() available via str.translate(), a custom unescape() function using re.sub(), as described in your question, is the most straightforward solution.