Python的re模块,正则表达式书写方法 (4)

#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了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpjsw.html