您的位置:首页 > 编程语言 > Python开发

python正则替换操作re.sub()

2015-01-05 20:20 351 查看
本科时候只泛泛的学过“C++之父"-浩强哥的一些些编程内容,虽然从事科研工作,远离了IT行业,但是想想技术不能丢,python作为一门脚本语言,还是要学一学滴,言归正传,今天学了点啥呢?嗯,re.sub,就说说这个吧。

网上自己搜些python入门小例程,看到一则这样的:

import re
d = dict()
def save(m):
l = m.groups()
d[l[0]] = l[2]
return l[0]+l[1]
s='this is a test [error] where we [hahah] can have a talk!'
print(s)
r = re.sub(r'(\w+)(\s+)\[(\w+)\]', save, s)
print(r)
print(d)

这则代码是百度知道里面一个答案,作用是利用python正则表达对字符串中的[]内容进行剔除,输出木有[]内容的字符串。仔细看了看,用到的python内容还不少,dict,group,正则都用上了,对于我这个小菜鸟新手来说要看一看~于是一个个的百度查看吧~

看看代码

d=dict()
定义了一个字典,我们暂时不管,貌似是作者要做些演示操作的,之后def了一个函数save

def save(m):
l = m.groups()
d[l[0]] = l[2]
return l[0]+l[1]
这里save函数对形参m进行了一个groups操作,于是就要百度groups()是干嘛的呢?哦,原来groups()是跟着正则表达式一起用的呀,对正则表达式提取内容进行分类存储,我们看下代码:

r = re.sub(r'(\w+)(\s+)\[.*\]', save, s)
r'(\w+)(\s+)\[.*\]'
(\w+)=>l[0] //也就是提取出来的整块字母啥的放到m.groups()[0]里面

(\s+)=>l[1]
//也就是提取出来的空格符放到m.groups()[1]里面

\["""(\w+)"""\]=>l[2]
//也就是提取出来的[]中()的内容放到m.groups()[2]里面

如果正则表达式中木有()之类的分割的话,那么我们的groups()貌似就木有啥作用了(百度知道)

ok.函数看过了,我们看看大头了,re.sub()的操作,re.sub百度了下,发现是一个替换操作,利用正则表达式,将s中出现的内容替换成re.sub的第二个参数,这个参数可以是一个字符,或者字符串,例如:

re.sub('[abc]', 'o', 'rock') >>>'rook'
这里就是通过查询目标字符串中是否存在a,b,c中的某个,查找到就替换成o。然而我们示例程序中第二个参数是一个函数啊,好吧,再看看是函数的时候是怎么操作的:

re.sub(patternreplstringcount=0flags=0)

If repl is
a function, it is called for every non-overlapping occurrence of pattern.

每个正则表达式都会调用这个函数,那就简单点理解吧,我们的s在re.sub的时候呢,调用这个save的函数,利用的当然是正则表达式的规则,找那种‘Anything+空格+[Anything]’的玩意,那么找到之后,替换规则就是save函数中给出的了,返回的是‘Anything+空格’,但是呢dict()中我们存一下Anything:[Angthing]这个玩意,以便日后观赏。小菜鸟也就只能理解到这个地步了,所以最后的输出,可想而知啦:

this is a test [error] where we [hahaha] can have a talk!
this is a test where we can have a talk!
{'test': 'error', 'we': 'hahaha'}
但是我们可以看出来哦,这个做法不好的地方,就是替换后多了一个空格,所以代码稍微修改下下:

    return l[0]
this is a test [error] where we [hahaha] can have a talk!
this is a test where we can
a38b
have a talk!
{'test': 'error', 'we': 'hahaha'}
然后看到那个百度知道下面有人留言说[(\w+)]太片面了,改成[.*],那么这样一来其实更简单了做起来,我们对save函数稍作修改就行了:

def save(m):
l = m.groups()
return ''
正则表达式那块呢修改下下:

r = re.sub(r'\[.*\]', save, s)

这样的话,我们不要啥dict()了,本来嘛就是用来删除[]内容的,这样简洁明了~save直接换成'(无内容)'也可以,不过放个函数吗,看着高大上一点,这样对re.sub的参数使用也更加熟悉一点。

re.sub我自己搜索的觉得这个文章写的不错:http://www.crifan.com/python_re_sub_detailed_introduction/ 供大家参考

好啦,小菜鸟就说这么多啦,啰嗦了点,嘻嘻~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式 python