php preg_replace 在 python

php preg_replace in python

我有一个 php 函数可以清除任何特殊字符,现在我想在 Python.

中创建一个类似 php 的函数

我的php函数:

function cleanString($text)
{
    $utf8 = array(
        '/[áàâãªä]/u'   =>   'a',
        '/[ÁÀÂÃÄ]/u'    =>   'A',
        '/[ÍÌÎÏ]/u'     =>   'I',
        '/[íìîï]/u'     =>   'i',
        '/[éèêë]/u'     =>   'e',
        '/[ÉÈÊË]/u'     =>   'E',
        '/[óòôõºö]/u'   =>   'o',
        '/[ÓÒÔÕÖ]/u'    =>   'O',
        '/[úùûü]/u'     =>   'u',
        '/[ÚÙÛÜ]/u'     =>   'U',
        '/ç/'           =>   'c',
        '/Ç/'           =>   'C',
        '/ñ/'           =>   'n',
        '/Ñ/'           =>   'N',
        '/–/'           =>   '-', // UTF-8 hyphen to "normal" hyphen
        '/[’‘‹›‚]/u'    =>   ' ', // Literally a single quote
        '/[“”«»„]/u'    =>   ' ', // Double quote
        '/ /'           =>   ' ', // nonbreaking space (equiv. to 0x160)
    );
    return preg_replace(array_keys($utf8), array_values($utf8), trim($text));
}

我在 Python 中试过如下:

def clean(text):
    utf8 = {
        '/[áàâãªä]/u'   :   'a',
        '/[ÁÀÂÃÄ]/u'    :   'A',
        '/[ÍÌÎÏ]/u'     :   'I',
        '/[íìîï]/u'     :   'i',
        '/[éèêë]/u'     :   'e',
        '/[ÉÈÊË]/u'     :   'E',
        '/[óòôõºö]/u'   :   'o',
        '/[ÓÒÔÕÖ]/u'    :   'O',
        '/[úùûü]/u'     :   'u',
        '/[ÚÙÛÜ]/u'     :   'U',
        '/ç/'           :   'c',
        '/Ç/'           :   'C',
        '/ñ/'           :   'n',
        '/Ñ/'           :   'N',
        '/–/'           :   '-', # UTF-8 hyphen to "normal" hyphen
        '/[’‘‹›‚]/u'    :   ' ', # Literally a single quote
        '/[“”«»„]/u'    :   ' ', # Double quote
        '/ /'           :   ' ', # nonbreaking space (equiv. to 0x160)
    }
    return re.sub(utf8.keys(), utf8.values(), text.strip())

但显示错误消息如下:

unhashable type: 'dict_keys'

Python 的 re.sub doesn't support array-style inputs the way PHP's preg_replace 是。您需要迭代替换,例如

def clean(text):
    utf8 = {
        '[áàâãªä]'   :   'a',
        '[ÁÀÂÃÄ]'    :   'A',
        '[ÍÌÎÏ]'     :   'I',
        '[íìîï]'     :   'i',
        '[éèêë]'     :   'e',
        '[ÉÈÊË]'     :   'E',
        '[óòôõºö]'   :   'o',
        '[ÓÒÔÕÖ]'    :   'O',
        '[úùûü]'     :   'u',
        '[ÚÙÛÜ]'     :   'U',
        'ç'          :   'c',
        'Ç'          :   'C',
        'ñ'          :   'n',
        'Ñ'          :   'N',
        '–'          :   '-', # UTF-8 hyphen to "normal" hyphen
        '[’‘‹›‚]'    :   ' ', # Literally a single quote
        '[“”«»„]'    :   ' ', # Double quote
        ' '          :   ' ', # nonbreaking space (equiv. to 0x160)
    }
    text = text.strip()
    for pat, repl in utf8.items():
        text = re.sub(pat, repl, text, 0, re.U)
    return text

另请注意,python 不在正则表达式周围使用定界符,您将 u 标志直接传递给 re.sub。我已经调整了您的代码来处理这些问题。

示例用法:

print(clean('ÂôÑ‹Î'))

输出:

AoN I