【问题标题】:Python: iterate over unicode characters in stringPython:遍历字符串中的 unicode 字符
【发布时间】:2021-06-15 16:45:13
【问题描述】:

我想遍历 Unicode 字符串中的每个字符,我正在这样做:

import unicodedata
import json

words = ['\\u05d5\\u05b7\\u05d9\\u05b0\\u05d3\\u05b7\\u05d1\\u05bc\\u05b5\\u05a3\\u05e8', '\\u05d9\\u05b0\\u05d4\\u05b9\\u05d5\\u05b8\\u0594\\u05d4', '\\u05d0\\u05b6\\u05dc\\u05be\\u05de\\u05b9\\u05e9\\u05c1\\u05b6\\u05a5\\u05d4', '\\u05d5\\u05b0\\u05d0\\u05b6\\u05bd\\u05dc\\u05be\\u05d0\\u05b7\\u05d4\\u05b2\\u05e8\\u05b9\\u0596\\u05df', '\\u05dc\\u05b5\\u05d0\\u05de\\u05b9\\u05bd\\u05e8\\u05c3']
for word in words:
    print(word)
    print(type(word))
    for idx, char in enumerate(word):
        char_name = unicodedata.name(char)
        print(char_name + ": " + char + " : " + json.dumps(char)) # comment out

但是输出是这样的:

REVERSE SOLIDUS: \ : "\\"
LATIN SMALL LETTER U: u : "u"
DIGIT ZERO: 0 : "0"
DIGIT FIVE: 5 : "5"
LATIN SMALL LETTER D: d : "d"
DIGIT FIVE: 5 : "5"
REVERSE SOLIDUS: \ : "\\"
LATIN SMALL LETTER U: u : "u"

如何遍历字符串中的 Unicode 字符?

我想我需要将 \\u 转换为 \u 但不知道该怎么做:

print(word.replace('\\u', '\u'))
                                  ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX escape

【问题讨论】:

  • 我不是。请仔细阅读问题。
  • 这根本不是我运行代码时得到的输出:Try it online!
  • 你有一个字符串,其内容看起来像 Python str 文字,而不是 str 值 'וַיְדַבֵּ֣ר'。
  • 您能否检查以确保您粘贴的代码正是您正在运行的代码?否则,请将提供此输出的代码复制粘贴到一个块中,以便我们对其进行测试/调试。
  • @hyper-neutrino 我的错 - 请参阅上面的修改代码

标签: python unicode


【解决方案1】:

在没有双反斜杠的情况下正确键入单词列表:

words = ['\u05d5\u05b7\u05d9\u05b0\u05d3\u05b7\u05d1\u05bc\u05b5\u05a3\u05e8', '\u05d9\u05b0\u05d4\u05b9\u05d5\u05b8\u0594\u05d4', '\u05d0\u05b6\u05dc\u05be\u05de\u05b9\u05e9\u05c1\u05b6\u05a5\u05d4', '\u05d5\u05b0\u05d0\u05b6\u05bd\u05dc\u05be\u05d0\u05b7\u05d4\u05b2\u05e8\u05b9\u0596\u05df', '\u05dc\u05b5\u05d0\u05de\u05b9\u05bd\u05e8\u05c3']
print(words)

或者使用.decode('unicode_escape') 转换列表,但必须先将.encode() 转换为字节串。由于原始字符串都是 ASCII 字符,您几乎可以使用任何标准编码来转换为字节,但'ascii' 是最明确的:

words = ['\\u05d5\\u05b7\\u05d9\\u05b0\\u05d3\\u05b7\\u05d1\\u05bc\\u05b5\\u05a3\\u05e8', '\\u05d9\\u05b0\\u05d4\\u05b9\\u05d5\\u05b8\\u0594\\u05d4', '\\u05d0\\u05b6\\u05dc\\u05be\\u05de\\u05b9\\u05e9\\u05c1\\u05b6\\u05a5\\u05d4', '\\u05d5\\u05b0\\u05d0\\u05b6\\u05bd\\u05dc\\u05be\\u05d0\\u05b7\\u05d4\\u05b2\\u05e8\\u05b9\\u0596\\u05df', '\\u05dc\\u05b5\\u05d0\\u05de\\u05b9\\u05bd\\u05e8\\u05c3']
words = [word.encode('ascii').decode('unicode_escape') for word in words]
print(words)

两者都导致:

['וַיְדַבֵּ֣ר', 'יְהֹוָ֔ה', 'אֶל־מֹשֶׁ֥ה', 'וְאֶֽל־אַהֲרֹ֖ן', 'לֵאמֹֽר׃']

【讨论】:

    【解决方案2】:

    您可以在 Python 中使用 split() 命令将您的字符串分解为一个列表。然后,您可以遍历列表中的元素。你可以这样做:

    string = "\\u05d5\\u05b7\\u05d9\\u05b0\\u05d3\\u05b7\\u05d1\\u05bc\\u05b5\\u05a3\\u05e8"
    
    splitted = string.split("\\")
    targetlist = []
    for s in splitted[1:]:
        targetlist.append(f"\\{s}")
    print(targetlist)
    

    这会产生:

    ['\\u05d5', '\\u05b7', '\\u05d9', '\\u05b0', '\\u05d3', '\\u05b7', '\\u05d1', '\\u05bc', '\\u05b5', '\\u05a3', '\\u05e8']
    

    【讨论】:

      【解决方案3】:

      显然需要对单词进行编码和解码以转义反斜杠:

      words = [word.encode('utf-8').decode('unicode_escape') for word in verse_unicode.split()]
      

      【讨论】:

        猜你喜欢
        • 2023-02-21
        • 2020-02-16
        • 2017-05-03
        • 2014-12-30
        • 1970-01-01
        • 2018-05-15
        相关资源
        最近更新 更多