美文网首页
正则表达式(三)

正则表达式(三)

作者: 叫我小包总 | 来源:发表于2019-04-29 23:10 被阅读0次

    前言

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

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

    正文

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

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

    import re

    language= 'pythonC#\nJavaPHP'

    r= re.findall('C#',language)#Python在正则表达式重复的表示出来  ;大小写字符

    # 正则表达式忽略大小写

    r1= re.findall('c#.{1}',language,re.I|re.S)#re.S表示匹配所有字符,包括\n  |表示且关系;re.I忽略字母大小写

    #'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))#0和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()它不会返回完整匹配结果,它会把匹配到的结果打印出来。

    相关文章

      网友评论

          本文标题:正则表达式(三)

          本文链接:https://www.haomeiwen.com/subject/qdspnqtx.html