Chinaunix首页 | 论坛 | 博客
  • 博客访问: 916601
  • 博文数量: 75
  • 博客积分: 1216
  • 博客等级: 少尉
  • 技术积分: 1998
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-11 16:20
个人简介

优秀是一种习惯

文章分类

全部博文(75)

文章存档

2014年(1)

2013年(29)

2012年(45)

分类: Python/Ruby

2013-04-08 12:45:07

        用python正则的时候,我想替换文本中第n个匹配,re.sub确做不到,让我有点失望了。。里面的count参数只能制定替换前n个,不能指定具体的某一个。只能自己重写了。。
       下面是我写的增强版re.sub方法,添加了此功能。此函数不仅可以指定正数第n个,也可以指定倒数第n个。

代码如下:

  1. #!/usr/bin/python
  2. #-*-coding:utf-8 -*-
  3. #此函数用替换第n个匹配,类似sed中s/reg/rep/n的用法。
  4. #使用方法:如果想替换第n个匹配,subExt('(reg)','replace',string,number=n);
  5. #             如果想替换倒数第n个匹配,subExt('(reg)','replace',string,number=-n)
  6. import re

  7. def list_sub(pattern,repl,t,rep_nu,flags):
  8.     t[rep_nu] = re.sub(pattern,repl,t[rep_nu],flags=flags)
  9.     return "".join(t)

  10. def subExt(pattern,repl,string,flags=0,number=1):
  11.     match_list = re.split(pattern,string,flags=flags)
  12.     match_nu = (len(match_list)-1) / 2
  13.     
  14.     if match_nu < int(number):
  15.         return string
  16.     elif number >= 0:
  17.         rep_nu = number * 2 - 1
  18.         return list_sub(pattern,repl,match_list,rep_nu,flags=flags)
  19.     else:
  20.         rep_nu = (match_nu + number + 1) *2 -1
  21.         return list_sub(pattern,repl,match_list,rep_nu,flags=flags)
测试结果:







阅读(13908) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

lizisong19882016-10-05 17:06:10

删掉网页自动插进去的所有斜杠\\

lizisong19882016-10-05 17:05:17

def list_sub(pattern,repl,t,rep_nu,flags):
    tx=\"\".join(t[rep_nu:])
    tx = re.sub(pattern,repl,tx,flags)#warning!the flags here give value to max in sub function
    return \"\".join(t[:rep_nu])+tx

修改了一下前面的函数,这样flags也能生效了,控制替换的个数.subExt中的number控制替换的开始位置