gpt4 book ai didi

python 正则表达式无法匹配特定的 Unicode > 2 个十六进制值

转载 作者:行者123 更新时间:2023-11-28 17:44:48 25 4
gpt4 key购买 nike

如何为大于 \uFFFF 的字符解析 unicode“字符串”?

尝试了 reregex 但似乎无法正确匹配大于 2 个十六进制值的 unicode 字符。

采用任何 unicode 字符串(例如,以 utf-8 编码的推文文本)

emotes = regex.findall('[\u263A\u263B\u062A\u32E1]',tweet_json_obj['text'])
if emotes: print "Happy:{0}".format(len(emotes))

输出是文本中包含的笑脸数量,效果很好!

但如果我尝试匹配表情符号集的 unicode 字符: http://www.fileformat.info/info/unicode/block/emoticons/index.htm

emotes = regex.findall('[\u01F600-\u01F64F]',tweet_json_obj['text'])
if emotes: print "Emoticon:{0}".format(len(emotes))

输出是字符串中所有字符的(数字)匹配,减去空格。正则表达式如何匹配推文中的每个字符,或者至少是看起来像 string.printable 的字符?

对于大多数数据集,预期结果是返回 0,因为我不希望人们插入这些表情符号,但它们可能...所以我想检查它们是否存在。我的正则表达式不正确吗?

最佳答案

代码点 在 BMP 之外 使用 \Uxxxxxxxx(所以大写 U 和 8 个十六进制字符)。您正在使用 \uxxxx,它只包含 四个 十六进制字符,00 不是 unicode 代码点的一部分:

>>> len(u'\u01f600')
3
>>> len(u'\U0001f600')
1
>>> u'\u01f600'[0]
'\u01f6'
>>> u'\u01f600'[1:]
'00'

你需要在这里使用unicode模式:

u'[\U0001F600-\U0001F64F]'

演示:

>>> import re
>>> re.search(u'[\U0001F600-\U0001F64F]', u'\U0001F600')
<_sre.SRE_Match object at 0xb73ead08>

您需要使用 UCS4 Python 构建,否则非 BMP 代码点是使用 UTF16 代理项对实现的,这将无法很好地与正则表达式配合使用。

如果 len(u'\U0001f600') 返回 2,那么您使用的是窄 UCS2 构建,或者您可以查看 sys.maxunicode ;宽构建返回 1114111,窄构建返回 65535。

在 UCS2 系统上,对于这种特定情况,您可以将 UTF16 代理与表达式匹配:

ur'\ud83d[\ude00-\ude4f]'

这与构成与 [\U0001F600-\U0001F64F] 相同范围的 UTF-16 代理对匹配,但在窄构建上:

>>> import sys
>>> sys.maxunicode
65535
>>> import re
>>> re.search(u'\ud83d[\ude00-\ude4f]', u'\U0001F600')
<_sre.SRE_Match object at 0x105e9f5e0>

关于python 正则表达式无法匹配特定的 Unicode > 2 个十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19966386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com