python regex无法匹配特定的Unicode>2个十六进制值

2024-10-16 17:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

以任何unicode字符串为例(例如,在utf-8中编码的tweet文本)

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

^{pr2}$

输出是字符串中所有字符的(数字)匹配,减去空格。 regex是如何匹配tweet中的每个字符的,或者至少是它的外观字符串。可打印?在

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


Tags: 字符串文本reinfo编码stringunicode字符
1条回答
网友
1楼 · 发布于 2024-10-16 17:29:05

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

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

您需要在此处使用unicode模式:

^{pr2}$

演示:

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

您需要使用ucs4python构建,否则非BMP代码点是使用UTF16代理项对实现的,这在正则表达式中不能很好地工作。在

如果len(u'\U0001f600')返回2,则您使用的是窄UCS2内部版本,或者可以查看^{};宽版本返回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>

相关问题 更多 >