我试图摆脱不包括小写字母数字和空格的字符串中的所有内容。
问题是当我使用这样的unicode字符时:
re.sub(r'[^a-å_\s]', '', '¤☃')
它没有被删除为什么这个以及我该怎么办呢?
答案 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
字节之外),您的输出只会被轻微过滤。
即使您切换为正确使用unicode
,ord(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'