前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则表达式(三)

正则表达式(三)

作者头像
stormwen
发布2019-08-05 10:32:31
4500
发布2019-08-05 10:32:31
举报
文章被收录于专栏:公众号:googpy公众号:googpy

前言

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

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

正文

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

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

代码语言:javascript
复制
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:查找后替换

代码语言:javascript
复制
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函数

代码语言:javascript
复制
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函数

代码语言:javascript
复制
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()函数

代码语言:javascript
复制
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()它不会返回完整匹配结果,它会把匹配到的结果打印出来。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 googpy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档