函数 re.sub() 拒绝工作,当我将 ANSI 字符串更改为 UNICODE 字符串时



当我使用 ANSI 字符时,它按预期工作:

>>> import re
>>> r = ur'(w+)s+(w+)s+(w+)?'
>>> s = 'what is it?'
>>> re.sub(r, ur'1<br>2<br>3<br>', s, re.UNICODE)
u'what<br>is<br>it<br>'

但是当我将字符串s更改为类似的字符串但包含 unicode 字符时 - 它无法按我想要的方式工作:

>>> s = u'что это есть?'
>>> re.sub(r, ur'1<br>2<br>3<br>', s, re.UNICODE)
u'u0427u0442u043e u044du0442u043e u0435u0441u0442u044c?'

看起来很奇怪(字符串保持不变),因为我在这两种情况下都使用 re.UNICODE......但是,re.match成功地将组与 UNICODE 标志匹配:

>>> m = re.match(r, s, re.UNICODE)
>>> m.group(1)
u'u0447u0442u043e'
>>> m.group(2)
u'u044du0442u043e'
>>> m.group(3)
u'u0435u0441u0442u044c'

您必须指定re.UNICODE作为flags参数

re.sub(r, ur'1<br>2<br>3<br>', s, flags = re.UNICODE)

否则,Python 正确地假设第 4 个参数是 count ,如 redocumenation 中指定的那样。

完整示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
r = ur'(w+)s+(w+)s+(w+)?'
#s = 'what is it?'
s = u'что это есть?'
print re.sub(r, ur'1<br>2<br>3<br>', s, flags = re.UNICODE).encode('utf-8')

最新更新