如何指定一系列 unicode 字符

Posted

技术标签:

【中文标题】如何指定一系列 unicode 字符【英文标题】:How do I specify a range of unicode characters 【发布时间】:2011-04-19 15:39:45 【问题描述】:

如何指定从' '(空格)到\u00D7FF的Unicode字符范围?

我有一个像r'[\u0020-\u00D7FF]' 这样的正则表达式,它不会编译说它是一个错误的范围。我是 Unicode 正则表达式的新手,所以我以前没有遇到过这个问题。

有没有办法让这个编译或我忘记或尚未学习的正则表达式?

【问题讨论】:

这里编译得很好(2.6.5) 你说得对 - 确实可以编译 - 我曾认为这是我正在处理的正则表达式的一部分有问题。我将发布导致我出现问题的部分。 【参考方案1】:

如果您使用的是 Python 2.x,则应确保指定的是 unicode 字符串(带有 u'' 或“unicode”内置):

>>> r = re.compile(u'[\u0020-\uD7FF]')
>>> r.search(u'foo \uD7F0 bar')
<_sre.SRE_Match object at 0xb7084950>
r.search(u' ')
<_sre.SRE_Match object at 0xb7084b48>

使用原始字符串(就像你一样,使用 r'')为你提供由“backstroke” + 字母“u”加上数字 0 加上...组成的 (ascii) 字符串...

【讨论】:

当 \u 不够长到 4 长时,您是否需要 '0' 字符?就像一个空间,你只有 \u20 但你必须写 \u0020?,对吧? 我看到你已经得到了回答,但是是的,没错:) 完整的 Unicode 怎么样?例如,Gothic 块从 U+10330 GOTHIC LETTER AHSA 到 U+1034A GOTHIC LETTER NINE HUNDRED,但还包括接下来的五个代码点,目前未命名?你如何在 Python 中表达哪些其他编程语言允许你使用\pGothic\pScript=Gothic\pInGothic\pBlock=Gothic?例如,在 Perl 中,/\pN/ &amp;&amp; /\pInGothic/ 产生 U+10341 GOTHIC LETTER NINETY 和 U+1034A GOTHIC LETTER NINE HUNDRED。但是,这在 Python 中不起作用;为什么不呢? 如果我理解正确,您可以使用大写 U 来表示更大的代码点,填充到 8 个十六进制数字。例如,在您的 U+10330 示例中,您将使用 u'\U00010330' @tchrist That doesn't work in Python, though; why not? Python re 模块从来没有很好地处理 Unicode,尽管第三方正则表达式库 (pypi.org/project/regex) 工作正常。【参考方案2】:

您的 unicode 范围的语法不会符合您的预期。

    原始的r'' 字符串防止\u 转义被解析,正则表达式引擎不会这样做。这个集合中唯一的范围是[0-\]

    >>> re.compile(r'[\u0020-\u00d7ff]', re.DEBUG)
    in
      literal 117
      literal 48
      literal 48
      literal 50
      range (48, 117)
      literal 48
      literal 48
      literal 100
      literal 55
      literal 102
      literal 102
    

    将其设为 Unicode 文字 causes \u parsing while leaving other backslashes alone(尽管这不是问题),但前导零会搞砸。语法为\uxxxx\Uxxxxxxxx,因此解析为“\u00d7,f,f”。

    >>> re.compile(ur'[\u0020-\u00d7ff]', re.DEBUG)
    in
      range (32, 215)
      literal 102
      literal 102
    

    删除前导零或切换到\U0000d7ff 将解决它:

    >>> re.compile(ur'[\u0020-\ud7ff]', re.DEBUG)
    in
      range (32, 55295)
    

【讨论】:

非常感谢 - 我不知道所有 unicode 的东西。所以,它必须是小写“u”的4位数字和大写“U”的8位数字,对吧? 请注意,此答案是在 Python 2 的上下文中做出的。在 Python 3 中,r"example"ur"example" 之间没有区别。

以上是关于如何指定一系列 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中打印 Unicode 字符

PHP:如何匹配一系列 unicode 配对代理表情符号/表情符号?

UTF-8 表示和 unicode 表示之间的字符串转换

Unicode 详解

请问如何用C语言实现汉字,和Unicode编码的转换?

unicode和多字节字符集的区别