当我使用 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')