扭转Python的re.escape

时间:2017-04-27 15:51:19

标签: python regex python-3.x escaping

如何扭转re.escape? This blog from 2007说没有反向功能,但十年之后仍然如此吗?

Python 2' decode('string_escape')不适用于所有转义字符(例如空格)。

>>> re.escape(' ')
'\\ '
>>> re.escape(' ').decode('string-escape')
'\\ '

Python 3:Some suggest unicode_escapecodec.escape_decodeast.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(' '))
' '

1 个答案:

答案 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>