正则表达式(三)

前言

这两天在读刻意练习,这本书写的很好,里面有一段是这样写的:“我深深地困在,当前的处境中。四面高墙,定义了我的空间格局。我就在这里,生活了很多年,而且可能继续生活下去。我要尽全力将其打破,触及更加广阔的世界。”

这段话的描写很符合我现在的处境,研究生的生活在外人看来很光鲜,其实不然。我们就这样困在三维空间的一个小小局部里,而要离开这个位置,就要采取行动,而且是持续地行动。那么,我现在能做的就是夯实基础,坚持写作,用自身的力量打破这高墙,即使有一天没有做到,那也会让这高墙有一丝裂纹。

正文

我喜欢用实例来学习知识点,这样知识点就从抽象概念变得具体,一起来看看今天的例子吧。

例1:正则表达式忽略大小写

import re
language = 'pythonC#\nJavaPHP'

r = re.findall('C#',language)    

r1 = re.findall('c#.{1}',language,re.I|re.S)    #'c#.{1}'首先匹配c#,再匹配任意字符

print(r)
print(r1)

这段代码中,findall函数还可以传入参数模式这个变量。当传入re.I时,正则表达式忽略大小写;当字符串中出现\n时,如果还要匹配出\n,可以看到,不仅正则表达式里面用到「. 」,但通过前面学习,「. 」表示匹配除\n的所有字符的概括集,所以,还需要在参数模式里再加上re.S,它表示匹配所有字符,其中|表示且关系。

例2:查找后替换

import re
language = 'pythonC#JavaC#PHPC#'

def convert(value):
    matched = value.group()         #用group()函数取出对象value的值
    return '!!'+ matched +'!!'

r = re.sub('C#','GO',language,0)    #0表示匹配无限匹配下去,最大匹配次数
r1 = re.sub('C#',convert,language)


language = language.replace('C#','GO')        #没有实现替换,需要新生成一个结果

print(r)
print(r1)
print(language)

对于这种应用场景,实现的方法很多。比如,可以用Python的内置函数.replace(),也可以用for遍历后再替换,或者用正则的表达式的函数re.sub()函数,下面就着重讲一下sub函数,它的第二个参数可以是函数,比如上面代码。

例3:re.sub函数

import re
s = 'A8C3721D86'
# s = 'A83C72D1D8E67'

def convert(value):
    matched = value.group()
    if int(matched) >= 6:
        return '9'
    else:
        return '0'

r = re.sub('\d',convert,s)

print(r)

这里,将正则表达式要替换的部分用函数表示,在函数中加入条件判断,最终可以实现。

用函数作为替换值,好处很多的,比如,将给定的字符串变一下,其中数字有1位,也有2位,这时可以根据需求,设定条件替换掉数字。

例4:re.match函数和re.search函数

import re

s = 'A83C72D1D8E67'
#从字母串首字母开始,如果没找到,将会返回none
r = re.match('\d',s)
print(r)

#搜索整个字符串,直到找到满足正则表达式的第一个字符串,返回结果,不会继续往下搜索
r1 = re.search('\d',s)
print(r1.group())
print(r1.span())                 #打印出搜索到第一个字符串的位置

r2 = re.findall('\d',s)
print(r2)

正则表达式中常用的函数是re.findall(),此外还有的两个函数就是re.match()和re.search()。

re.match()函数,从字符串首字母开始查找,如果没有找到正则表达式,就会返回None。

re.search()函数,搜索整个字符串,直到找到满足正则表达式的第一个字符串,返回结果,但不会继续往下搜索。

代码中列出了三种函数的对比,通过打印结果可以知道,findall()相对最好用的、也是最常用ed函数。

例5:group()函数

import re

s = 'life is shot ,i use python, i love python'

r = re.search('life(.*)python(.*)python',s)
r1 = re.findall('life(.*)python(.*)python',s)

print(r.group(0))                   #group(0)记录完整匹配结果
print(r.group(1))                              
print(r.group(2))

print(r.group(0,1,2))               #打印出0,1,2组的值
print(r.groups())                   #groups()不会返回完整匹配结果

print(r1)

最后,通过一个例子了解一下group这个分组函数。在上面这行代码中,正则表达式中用life和Python作为匹配的边界,将(.*)作为一组匹配值。

group(0)是group函数的特殊形式,它记录完整的匹配结果,还要注意到groups()它不会返回完整匹配结果,它会把匹配到的结果打印出来。

原文发布于微信公众号 - googpy(googpy)

原文发表时间:2019-04-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券