如何扭转re.escape? This blog from 2007说没有反向功能,但十年之后仍然如此吗?
Python 2' decode('string_escape')
不适用于所有转义字符(例如空格)。
>>> re.escape(' ')
'\\ '
>>> re.escape(' ').decode('string-escape')
'\\ '
Python 3:Some suggest unicode_escape
或codec.escape_decode
或ast.literal_eval
但空格没有运气。
>>> re.escape(b' ')
b'\\ '
>>> re.escape(b' ').decode('unicode_escape')
'\\ '
>>> codecs.escape_decode(re.escape(b' '))
(b'\\ ', 2)
>>> ast.literal_eval(re.escape(b' '))
ValueError: malformed node or string: b'\\ '
这是唯一有效的吗?
>>> re.sub(r'\\(.)', r'\1', re.escape(' '))
' '
答案 0 :(得分:1)
那么这真的是唯一可行的方法吗?
>>> re.sub(r'\\(.)', r'\1', re.escape(' ')) ' '
是的。 re
模块的source不包含unescape()
函数,因此您肯定需要自己编写。>
此外,re.escape()
函数使用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')
…,尽管它可以将单个字符转换为多个字符(例如[
→\[
),但不能执行相反的操作。
由于没有escape()
可以直接逆转str.translate()
的情况,因此,最简单的解决方案就是使用unescape()
的自定义re.sub()
函数,如您的问题所述。 / p>