Python正则表达式不使用unicode

时间:2016-11-18 19:32:08

标签: python regex python-2.7

我试图摆脱不包括小写字母数字和空格的字符串中的所有内容。

问题是当我使用这样的unicode字符时:

re.sub(r'[^a-å_\s]', '', '¤☃')

它没有被删除为什么这个以及我该怎么办呢?

3 个答案:

答案 0 :(得分:2)

你可以use Unicode

>>> re.sub(ur'[^a-å_\s]', u'', u'¤☃')
u'\xa4'
>>> print re.sub(ur'[^a-å_\s]', u'', u'¤☃')
¤

答案 1 :(得分:0)

您可以删除任何非ASCII字符,如下所示:

>>> import re
>>> 
>>> print re.sub(ur'[^\x00-\x7F]', u'', u'123aąść1b2d3')
123a1b2d3

如果你想坚持一些额外的非ASCII,只需将它们添加到正则表达式。

print re.sub(ur'[^\x00-\x7Fæøø]', u'', u'123aąść1b2d3æøø')
123a1b2d3æøø

答案 2 :(得分:0)

其他人已经解释过,您需要unicode正则表达式并使用unicode个参数才能正确使用unicode; Python可能以编码形式存储'¤☃',通常为UTF-8,将输入存储为'\xc2\xa4\xe2\x98\x83',正则表达式本身为'[^a-\xc3\xa5+_\\s]',这意味着您的字符类不包括空格和序数从97到195(加上明确排除165,但是在前一个范围内),而不是像你预期的那样从第97到229号。事情是,因为UTF-8编码的输入由此范围内的字节表示(除了被丢弃的e2字节之外),您的输出只会被轻微过滤。

即使您切换为正确使用unicodeord(u'¤')为164,而ord(u'å')为229;它正确保留¤,因为它已被排除在替换之外的字符类中。

你不应该在这里使用正则表达式,因为详尽地定义分散在Unicode范围内的所有字母和空白字符同时排除所有其他字符,这是不切实际的。相反,使用实际使用Unicode数据库的工具来检查字符属性:

>>> u''.join(x for x in u'a¤ ☃b' if x.isspace() or x.islower())
u'a b'

对于你正在尝试做什么更加清楚,它应该足够快; Python使用的Unicode数据库使得检查字符属性的成本相当微不足道。如果您的输入以str(编码为UTF-8)到达,并且您必须生成str输出,则只需转换为unicode,过滤,然后转换回来:

>>> inp = 'a¤ ☃b'  # Not unicode!
>>> inpuni = inp.decode('utf-8')
>>> outpuni = u''.join(x for x in inpuni if x.isspace() or x.islower())
>>> outp = outpuni.encode('utf-8')
>>> outp
'a b'