后面的字符集错误re.sub公司()

2024-09-29 23:20:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个密码

import chardet, re    

content = "Бланк свидетельства о допуске."
print content
print chardet.detect(content)
content = re.sub(u"(?i)[^-0-9a-zа-яё«»\&\;\/\<\>\.,\s\(\)\*:!\?]", "", content)
print content
print chardet.detect(content)

和输出

^{pr2}$

我做错什么了?如何在re.sub()之后获得uft-8字符串? {Pyutf,Pyutf中的}(Pyutf,Pyutf中的。在

谢谢。在


Tags: 字符串importre密码contentprintdetectchardet
2条回答

这就是(我认为)您要实现的目标(为了清晰起见,我简化了regexp):

#coding=utf8
import re    
content = u"Бланк XYZ свидетельства о ???допуске."
content = re.sub(u"(?iu)[^а-яё]", ".", content)
print content.encode('utf8') # Бланк.....свидетельства.о....допуске.

注意要点:

  • 主题是unicode
  • 表达式是unicode
  • 表达式使用unicode标志(?u)来进行大小写折叠。在

另外,对于严肃的unicode工作,我建议使用regex模块,它提供了极好的几乎完全的unicode支持。考虑:

^{2}$

虽然re.UNICODE只改变\w和朋友,但在我的测试中,它也会影响大小写折叠(re.IGNORECASE):

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> src = u'Σσ Φφ Γγ'
>>> src
u'\u03a3\u03c3 \u03a6\u03c6 \u0393\u03b3'
>>> re.sub(ur'(?i)[α-ώ]', '-', src)
u'\u03a3- \u03a6- \u0393-'
>>> re.sub(ur'(?iu)[α-ώ]', '-', src)
u'     '

所以这要么是一个未记录的特性,要么是文档问题。在

您的输入是UTF-8:

>>> content
'\xd0\x91\xd0\xbb\xd0\xb0\xd0\xbd\xd0\xba \xd1\x81\xd0\xb2\xd0\xb8\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd1\x82\xd0\xb2\xd0\xb0 \xd0\xbe \xd0\xb4\xd0\xbe\xd0\xbf\xd1\x83\xd1\x81\xd0\xba\xd0\xb5.'

但是您使用的是一个unicode正则表达式。表达式直接匹配 UTF-8输入的原始字节。在

在所有这些字节中,只有空格、句号和\xbb字节(作为»字符)不会被删除。其余的单个字节将被删除,因为它们不属于负字符类[^...]。在

正确使用Unicode(首先将content解码为Unicode)可以:

^{2}$

另一种方法是对正则表达式使用原始字节字符串,并匹配字节组合。计算UTF-8字节和范围的有效性是非常困难的。您需要完全理解UTF-8 encodes characters to multiple bytes,然后将负字符类转换为允许通过相同字节组合的一组匹配。这对胆小的人来说不是。在

相关问题 更多 >

    热门问题