s = u'ft,我'
print re.sub(ur'(?s)&#(\d+);', lambda x:unichr(int(x.group(1))), s)
执行结果:
[quote]ft,我[/quote]
实际上,python的sub函数第二参数,即replacement,可以为一个函数.函数的输入就是成功匹配的match object, 输出,亦即返回值,就是用于替换的replacement.这样可根据具体每次不同的成功匹配对象字串,进行不同的替换.
除了上例,又如,定义替换函数:
def replacem(o):
if o.group(0)=='-':return ' '
else: return '*'
然后
print re.sub ('-{1,2}',replacem,'pro---g--r-am')
输出结果为:[quote]pro* g*r am[/quote]
实际上,对match obj来说,group()函数在python中的定义是这样的, group(0)为整个匹配成功的字串,而group(1~N)为可能在pattern中出现的捕获型括号所匹配的对象串(这也表明python和大多数语言一样是NFA型的正则表达式:)).
比如开头一例,对匹配成功的两处,","和"我",他们各自内部的group(1)就是(\d+)匹配的内容,即65292和25105,接着函数将它们转成十进制整数,即unicode编码,进而变为unicode字符.
也许读者开始还对开头一例中的(?s)疑惑不解.实际上这是所谓的单行匹配模式,实际上是使点号能匹配本来不能匹配的换行符.为啥叫单行匹配模式我估计是,把一串含有多个物理多行的文本视为单行文本处理,故为单行匹配.
至于为什么例子中要有这个,这就无从考证了,因为没有(?s),该regex一样正常工作.实际上,可能只是原作者的regex使用习惯.-_-b