前言
这两天在读刻意练习,这本书写的很好,里面有一段是这样写的:“我深深地困在,当前的处境中。四面高墙,定义了我的空间格局。我就在这里,生活了很多年,而且可能继续生活下去。我要尽全力将其打破,触及更加广阔的世界。”
这段话的描写很符合我现在的处境,研究生的生活在外人看来很光鲜,其实不然。我们就这样困在三维空间的一个小小局部里,而要离开这个位置,就要采取行动,而且是持续地行动。那么,我现在能做的就是夯实基础,坚持写作,用自身的力量打破这高墙,即使有一天没有做到,那也会让这高墙有一丝裂纹。
正文
我喜欢用实例来学习知识点,这样知识点就从抽象概念变得具体,一起来看看今天的例子吧。
例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()它不会返回完整匹配结果,它会把匹配到的结果打印出来。
网友评论