re.sub上的Python正则表达式额外字符(正则表达式替换)

时间:2017-07-09 14:20:08

标签: python regex python-2.7

我正在尝试创建一个简单的函数来仅用正常的字符替换带重音的字符:

import re

def remove_accents(r):
    r = re.sub("[àáâãäå]", 'a', r)
    r = re.sub("[èéêë]", 'e', r)
    r = re.sub("[ìíîï]", 'i', r)
    r = re.sub("[òóôõö]", 'o', r)
    r = re.sub("[ùúûü]", 'u', r)
    r = re.sub("[ýÿ]", 'y', r)

    return r

我遇到的问题是下一个问题,当我尝试用正常的字符替换重音字符时,Python正在添加一个额外的字符,我不知道为什么。

示例

import re

my_string = "Joaquín Noriega"
print re.sub(r"[ìíîï]", r'i', my_string)

这是我输出的内容:

Output: 'Joaquiin Noriega'

请注意名称上的双重“ ii ”,应为“ Joaquin Noriega

  • 为什么会这样?我的正则表达式有问题吗?

1 个答案:

答案 0 :(得分:2)

Python 2字符串是字节,因此作为UTF-8,正则表达式看起来像这样:

'[\xc3\xac\xc3\xad\xc3\xae\xc3\xaf]'
í中的{p> "Joaquín Noriega"以相同的方式编码 - 两个字节 - 并且它们都匹配字符类,因此它们都被单字节i替换。 / p>

对此更好的解决方法是切换到Python 3(它具有合理的文本处理),但如果不能,则Unicode字符串将执行:

import re

my_string = u"Joaquín Noriega"
print re.sub(u"[ìíîï]", u'i', my_string)