Python\ufffd替换为中文内容后

2024-04-26 10:42:04 发布

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

找到this question的答案后,我们将面临下一个不寻常的替换行为:

我们的正则表达式是:

[\\((\\[{【]+(\\w+|\\s+|\\S+|\\W+)?[)\\)\\]}】]+

我们正在尝试匹配任何类型方括号内的所有内容,包括方括号 原文是:

^{pr2}$

结果是:

物�研真题详解

更换代码为:

 delimiter = ' '
 if localization == 'CN':
        delimiter = ''
  p = re.compile(codecs.encode(unicode(regex), "utf-8"), flags=re.I)
  columnString = (p.sub(delimiter, columnString).strip()

为什么出现?(\ufffd)字符以及如何修复这种行为?在

我们在使用regex时也面临同样的问题:

(\\d*[满|元])

print repr(columnString)='\xe5\xbd\x93\xe4\xbb\xa3\xe9\xaa\xa8\xe4\xbc\xa4\xe7\xa7\x91\xe5\xa6\x99\xe6\x96\xb9(\xe7\xac\xac\xe5\x9b\x9b\xe7\x89\x88)'

print repr(regex)=u'[\\(\uff08\\[{\u3010]+(\\w+|\\s+|\\S+|\\W+)?[\uff09\\)\\]}\u3011]+'

print repr(p.pattern)='[\\(\xef\xbc\x88\\[{\xe3\x80\x90]+(\\w+|\\s+|\\S+|\\W+)?[\xef\xbc\x89\\)\\]}\xe3\x80\x91]+'

Tags: reregexprintdelimiterreprxe7方括号xe5
2条回答

不应将UTF-8和正则表达式混合使用。将所有文本处理为Unicode。确保先将regex和输入字符串解码为unicode值:

>>> import re
>>> columnString = '\xe5\xbd\x93\xe4\xbb\xa3\xe9\xaa\xa8\xe4\xbc\xa4\xe7\xa7\x91\xe5\xa6\x99\xe6\x96\xb9(\xe7\xac\xac\xe5\x9b\x9b\xe7\x89\x88)'
>>> regex = '[\\(\xef\xbc\x88\\[{\xe3\x80\x90]+(\\w+|\\s+|\\S+|\\W+)?[\xef\xbc\x89\\)\\]}\xe3\x80\x91]+'
>>> utf8_compiled = re.compile(regex, flags=re.I)
>>> utf8_compiled.sub('', columnString)
'\xe5\xbd\x93\xe4\xbb\xa3\xe9\xaa\xa8\xe4'
>>> print utf8_compiled.sub('', columnString).decode('utf8', 'replace')
当代骨�
>>> unicode_compiled = re.compile(regex.decode('utf8'), flags=re.I | re.U)
>>> unicode_compiled.sub('', columnString.decode('utf8'))
u'\u5f53\u4ee3\u9aa8\u4f24\u79d1\u5999\u65b9'
>>> print unicode_compiled.sub('', columnString.decode('utf8'))
当代骨伤科妙方
>>> print unicode_compiled.sub('', u'物理化学名校考研真题详解 (理工科考研辅导系列(化学生物类))')
物理化学名校考研真题详解 

在您的模式中使用UTF-8时,代码点由单独的字节组成:

^{pr2}$

这意味着您的字符类与这些字节中的任何一个匹配;\xe3,或{}或{}都是该字符类中分别有效的字节。在

首先对字符串进行解码,然后可以去掉这个‘(\ufffd)字符。在

In [1]: import re
   ...: subject = '物理化学名校考研真题详解 (理工科考研辅导系列(化学生物类))'.decode('utf-8')
   ...: reobj = re.compile(r"[\((\[{【]+(\w+|\s+|\S+|\W+)?[)\)\]}】]+", re.IGNORECASE | re.MULTILINE)
   ...: result = reobj.sub("", subject)
   ...: print result
   ...: 
物理化学名校考研真题详解 

相关问题 更多 >