Python:re.split()显示西里尔文结果

时间:2013-08-11 23:49:32

标签: python regex utf-8 cyrillic

我尝试编写一个函数,只需将字符串拆分为任何不是字母或数字的符号。但我需要使用西里尔语,当我这样做时,我得到的输出列表包含'\ x0d'等元素,而不是拉丁语。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

class Syntax():
    def __init__(self, string):
        self.string = string.encode('utf-8')
        self.list = None

    def split(self):
        self.list = re.split(ur"\W+", self.string, flags=re.U)

if __name__ == '__main__':  
    string = ur"Привет, мой друг test words."
    a = Syntax(string)
    a.split()
    print a.string, a.list

控制台输出:

Привет, мой друг test words.
['\xd0', '\xd1', '\xd0', '\xd0\xb2\xd0\xb5\xd1', '\xd0\xbc\xd0\xbe\xd0\xb9', '\xd0', '\xd1', '\xd1', '\xd0\xb3', 'test', 'words', ''] 

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 您在语法构造函数中强制将unicode转换为字符串。通常,您应将文本值保留为unicode。 (self.string = string,no encoding)。

  2. 当您打印Python列表时,它会调用元素上的repr,导致unicode被强制转换为这些值。如果你这样做

    for x in a.list:
        print x
    
  3. 在进行第一次更改后,它将打印出西里尔文。

    编辑:打印列表调用元素上的repr,而不是字符串。但是,打印字符串不会重新打印它 - print x和print repr(x)会产生不同的值。对于字符串,repr总是可以在Python中评估以恢复值。