【问题标题】:Python: re.split() display cyrillic resultPython:re.split() 显示西里尔字母结果
【发布时间】:2013-08-13 05:25:09
【问题描述】:

我尝试编写一个函数,该函数只需将字符串按任何不是字母或数字的符号进行拆分。但是我需要使用西里尔字母,当我这样做时,我会得到带有 '\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', ''] 

感谢您的帮助。

【问题讨论】:

    标签: python regex utf-8 cyrillic


    【解决方案1】:

    这里有两个问题:

    1. 您在 Syntax 构造函数中强制将 unicode 转换为字符串。通常,您应该将文本值保留为 unicode。 (self.string = 字符串,无编码)。

    2. 当您打印 Python 列表时,它会在元素上调用 repr,从而将 unicode 强制转换为这些值。如果你这样做了

      for x in a.list:
          print x
      

    在进行第一次更改后,它将打印 Cyrillic。

    编辑:打印列表调用 repr 元素,而不是字符串。然而,打印一个字符串并不能代表它 - print x 和 print repr(x) 产生不同的值。对于字符串,repr 始终是您可以在 Python 中评估以恢复值的东西。

    【讨论】:

    • 2. 是垃圾 - print somelist 调用 repr(list),它在每个条目上调用 repr1. 看起来是这里唯一的问题,尽管\w 仅匹配 ascii 也可能存在问题。
    • 如果我将 self.string=string.encode('utf-8') 更改为 self.string=string 我得到一个错误: print a.string: UnicodeEncodeError: 'ascii' codec can't编码位置 0-5 中的字符:序数不在范围内(128)
    • @user2673265:这是另一个问题 - print ur"Привет, мой друг test words." 对我自己来说失败了
    • 知道了!我应该只为打印而编码字符串和列表元素,但不要将编码的字符串传递给 split() 函数。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多