【问题标题】:python regex fails to match a specific Unicode > 2 hex valuespython 正则表达式无法匹配特定的 Unicode > 2 十六进制值
【发布时间】:2013-11-26 19:09:36
【问题描述】:

如何解析大于 \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,因为我不希望人们插入这些表情符号,但它们可能......所以我想检查它们是否存在。我的正则表达式不正确吗?

【问题讨论】:

    标签: python regex python-2.7 unicode


    【解决方案1】:
    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>
    

    【讨论】:

    • 谢谢,花了 2 天时间研究 unicode,并且从未将 UCS2 与 UCS4 与我在访问平面中的字符的问题上联系在一起 > 0。是的,我的 sys.maxunicode 返回 65535,所以这是一个狭窄的构建。我将构建一个 UCS4,并使用“U”编码,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 2017-02-27
    • 2017-06-17
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多