`
provista
  • 浏览: 120447 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Regex in Python (1)

阅读更多
s = u'ft,我'
print re.sub(ur'(?s)&#(\d+);', lambda x:unichr(int(x.group(1))), s)

执行结果:
引用
ft,我

实际上,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')

输出结果为:
引用
pro* g*r am


实际上,对match obj来说,group()函数在python中的定义是这样的, group(0)为整个匹配成功的字串,而group(1~N)为可能在pattern中出现的捕获型括号所匹配的对象串(这也表明python和大多数语言一样是NFA型的正则表达式:)).
比如开头一例,对匹配成功的两处,","和"我",他们各自内部的group(1)就是(\d+)匹配的内容,即65292和25105,接着函数将它们转成十进制整数,即unicode编码,进而变为unicode字符.

也许读者开始还对开头一例中的(?s)疑惑不解.实际上这是所谓的单行匹配模式,实际上是使点号能匹配本来不能匹配的换行符.为啥叫单行匹配模式我估计是,把一串含有多个物理多行的文本视为单行文本处理,故为单行匹配.
至于为什么例子中要有这个,这就无从考证了,因为没有(?s),该regex一样正常工作.实际上,可能只是原作者的regex使用习惯.-_-b

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics