如何指定' '
(空格)到\u00D7FF
的一系列unicode字符?
我有一个像r'[\u0020-\u00D7FF]'
这样的正则表达式,它不会编译说它是一个糟糕的范围。我是Unicode正则表达式的新手,所以我之前没有遇到过这个问题。
有没有办法让这个编译或正则表达式让我忘记或者还没有学到呢?
答案 0 :(得分:27)
你的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)
答案 1 :(得分:5)
如果您使用的是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'')给你(“ascii”字符串)由“仰泳”+字母“u”加上数字0加......