使用正则表达式删除除撇号u + 2019之外的特殊符号

时间:2016-02-03 19:55:57

标签: regex python-2.7 non-ascii-characters

从用户输入,我有一串包含特殊unicode字符的名称。我使用的是Python 2.7。

前:

Panzdella*, Meslone‡, Pezzeella, Rossssi, Pastooori, Perfeetti, D’Erriico†, Puunta*, and d’Ischaia. 

我想删除除*和撇号(')之外的所有特殊字符。

这就是我正在做的事情:

import re

authors = raw_input('enter authors to clean characters: ')

# old code authors = re.sub(r'[^a-zA-Z0-9 - \,\*-\u2019]', '', authors)

#new suggestion
authors = re.sub(r'[^a-zA-Z0-9 ,*\u2019-]', '', authors)
print authors

结果不保留卷曲撇号'(u + 2019)。

如何使用正则表达式提供卷曲撇号异常?

2 个答案:

答案 0 :(得分:1)

您可以使用:

pressed

确保将连字符保留在字符类的最后或第一个位置。

<强>输出:

authors  = re.sub(ur'[^a-zA-Z0-9 ,*\u2019-]', '', authors)

示例代码:

Panzdella*, Meslone, Pezzeella, Rossssi, Pastooori, Perfeetti, D’Erriico, Puunta*, and d’Ischaia

答案 1 :(得分:1)

关于您使用的前一种模式的一些注释:

  • space + - + space刚刚匹配空格,因为连字符创建了从空间到空间的范围
  • *-\uXXX也试图制作一个范围,这不是你想要的。

要避免字符类中的文字连字符出现问题,请将它们放在开头或结尾:

[^a-zA-Z0-9 ,*\u2019-]

现在,由于您使用的是Python 2.7,因此字符串是字节数组,为了使用Unicode,它们必须始终转换(en / decode)到/从UTF8转换。

以下是一种使其有效的方法:

# -*- coding: utf-8 -*-
import re
authors = "Panzdella*, Meslone‡, Pezzeella, Rossssi, Pastooori, Perfeetti, D’Erriico†, Puunta*, and d’Ischaia."
authors = re.sub(ur'[^a-zA-Z0-9 ,*\u2019-]', u'', authors.decode('utf8'), 0, re.UNICODE).encode("utf8")
print authors

请参阅IDEONE demo

输出:Panzdella*, Meslone, Pezzeella, Rossssi, Pastooori, Perfeetti, D’Erriico, Puunta*, and d’Ischaia