Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何指定unicode字符的范围_Python_Regex_Unicode - Fatal编程技术网

Python 如何指定unicode字符的范围

Python 如何指定unicode字符的范围,python,regex,unicode,Python,Regex,Unicode,如何指定从'(空格)到\u00D7FF的unicode字符范围 我有一个像r'[\u0020-\u00D7FF]'这样的正则表达式,它不会编译,因为它的范围不好。我是Unicode正则表达式的新手,所以以前没有遇到过这个问题 有没有一种方法可以使此表达式或正则表达式编译成我忘记或还没有学会的表达式?如果您使用的是Python 2.x,您应该确保指定的是unicode字符串(带有u'',或内置的unicode): >>r=re.compile(u'[\u0020-\uD7FF]') >>>r.se

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

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


有没有一种方法可以使此表达式或正则表达式编译成我忘记或还没有学会的表达式?

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

>>r=re.compile(u'[\u0020-\uD7FF]')
>>>r.search(u'foo\uD7F0 bar')
r、 搜索(u“”)

使用原始字符串(与r“”一样)会得到由“仰泳”+字母“u”加上数字0+组成的(ascii)字符串…

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文字(尽管这里不关心这个问题),但前导零将其弄乱。语法是
    \uxxx
    \uxxxxx
    ,因此它被解析为“
    \u00d7
    f
    f

  • 删除前导零或切换到
    \U0000d7ff
    将修复它:

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

  • 它在这里编译得很好(2.6.5)你是对的-确实可以编译-我假设这是我正在处理的正则表达式中出现问题的部分。我将发布引起我问题的部分。非常感谢-我不知道所有unicode的东西。所以,它必须是4位小写字母“u”和8位大写字母“u”,对吗?请注意,这个答案是在Python2的上下文中给出的。在Python3中,
    r“example”
    ur“example”
    之间没有区别。当\u的长度不足以达到4时,是否需要“0”字符?就像一个空格,你只有\u20,但你必须写\u0020?,对吗?我知道你已经得到了回答,但是是的,没错:)完整的Unicode呢?例如,哥特式区块从U+10330哥特式字母AHSA到U+1034A哥特式字母九百,但也包括接下来的五个代码点,目前尚未命名?在Python中,您如何表达其他编程语言允许您使用的
    \p{Gothic}
    \p{Script=Gothic}
    \p{InGothic}
    ,或
    \p{Block=Gothic}
    ?例如,在Perl中,
    /\pN/&&/\p{InGothic}/
    生成U+10341哥特式字母90和U+1034A哥特式字母900。但是,这在Python中不起作用;为什么不呢?如果我理解正确,你可以用大写的U来表示更大的代码点,填充到8个十六进制数字。例如,在您的U+10330示例中,您将使用在Python中不起作用的U'\U00010330'@tchrist
    ;为什么不呢?
    Python
    re
    模块从未很好地处理过Unicode,尽管第三方regex库()工作得很好。
    >>> re.compile(ur'[\u0020-\u00d7ff]', re.DEBUG)
    in
      range (32, 215)
      literal 102
      literal 102
    
    >>> re.compile(ur'[\u0020-\ud7ff]', re.DEBUG)
    in
      range (32, 55295)