Python:遍历字符串中的unicode字符
Python: iterate over unicode characters in string
我想遍历 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
您可以使用 Python 中的 split() 命令将您的 sting 分解成一个列表。然后您可以迭代列表中的元素。您可以按照以下方式执行此操作:
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']
显然需要对单词进行编码和解码以转义反斜杠:
words = [word.encode('utf-8').decode('unicode_escape') for word in verse_unicode.split()]
在没有双反斜杠的情况下正确输入单词列表:
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)
两者都导致:
['וַיְדַבֵּ֣ר', 'יְהֹוָ֔ה', 'אֶל־מֹשֶׁ֥ה', 'וְאֶֽל־אַהֲרֹ֖ן', 'לֵאמֹֽר׃']
我想遍历 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
您可以使用 Python 中的 split() 命令将您的 sting 分解成一个列表。然后您可以迭代列表中的元素。您可以按照以下方式执行此操作:
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']
显然需要对单词进行编码和解码以转义反斜杠:
words = [word.encode('utf-8').decode('unicode_escape') for word in verse_unicode.split()]
在没有双反斜杠的情况下正确输入单词列表:
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)
两者都导致:
['וַיְדַבֵּ֣ר', 'יְהֹוָ֔ה', 'אֶל־מֹשֶׁ֥ה', 'וְאֶֽל־אַהֲרֹ֖ן', 'לֵאמֹֽר׃']