#sub方法会将匹配到的数据依次传到方法read_num中,所以我们首先要使用group方法获取到每个参数的具体内容,然后将这个字符串转为int类型,再加1,注意return的时候要转为字符串,这个位置的值只能是字符串
def read_num(num):
num_temp = num.group()
num = int(num_temp) + 1
return str(num)
s = "阅读次数为:999,浏览次数为2000"
ret = re.sub(r"\d+",read_num,s)
print(ret)
print结果:阅读次数为:1000,浏览次数为2001
# 将句子中的pho换成python
>>> ret = re.sub(r"php","python","I love php")
>>> ret
'I love python'
区分大小写:
>>> ret = re.sub(r"php","python","I love phP")
>>> ret
'I love phP'
Python中的贪婪和非贪婪
Python中默认的匹配时贪婪的(即尽可能多的匹配),那么如何能做到非贪婪呢?
在“*”“?”“+”“{m,n}”的后面加上?就可以做到非贪婪,尽可能少的匹配
比如:s="this is a number: 0312-265-8888",匹配出里面的电话号码,如果用下面第一种方法:
>>> ret = re.match(r".+(\d+-\d+-\d+)",s) #因为要匹配数字,所以把号码用括号括起来
>>> ret.group()
'this is a number: 0312-265-8888'
#这个结果是这种方式提取到的号码,明显不是我们想要的
>>> ret.group(1)
'2-265-8888'
这面这种方式就是贪婪方式,前面的.+尽可能的匹配多一些,后面的\d+只要有一个数字就可以满足,所以别的数字都归到了.+里面,在.+的后面加?后结果就不一样了:
>>> ret = re.match(r".+?(\d+-\d+-\d+)",s)
>>> ret.group(1)
'0312-265-8888'
加了?改成了非贪婪模式,那就是说尽可能多的匹配后面的\d+。
这个的group()方法,还有另外的类似方法是groups(),举例:
>>> ret = re.match(r"(.+?)(\d+-\d+-\d+)",s)
>>> ret.groups()
('this is a number: ', '0312-265-8888')
Groups方法返回一个元祖,每一个分组匹配到的字符串放到元祖里面。
上面的结果是加了?的,如果不加?,那么结果为:
>>> ret = re.match(r"(.+)(\d+-\d+-\d+)",s)
>>> ret.groups()
('this is a number: 031', '2-265-8888')
Split()方法的用法:
找出s中的单词
>>> s = "hi python,hello world"
#用,或者空格分隔s,返回一个列表,注意:|的后面有一个空格
>>> ret = re.split(r",+| +",s)
>>> ret
['hi', 'python', 'hello', 'world']
思考:
将多个http链接比如:?506458的后半部分去掉,只留下,如何做?
分析:后面这部分“?506458”不好匹配,但是前面比较有规律,思路就可以考虑匹配到前面的内容
>>> ret = re.sub(r"(+?/).*",lambda x:x.group(1),s)
>>> ret
'http://www.51testing.com/'
解析:前面的正则表达式"(+?/).*",可以匹配到的内容应该是整个http链接,把这个结果传入到lambda函数中,x的值就是正则表达式匹配的结果,然后x.group(1)就是将分组的第一个返回。这样就ok了。