python学习(18)--正则表达式3

28 篇文章 0 订阅
24 篇文章 1 订阅

      这一节我们来介绍下正则表达式中的常用函数,Python中的re模块为我们提供了很多有关正则表达式操作的函数.如函数sub(),subn(),splite(),finditer(),match(),search()等等,熟练的使用这些函数,不仅可以提高正则表达式的匹配效率,还可以让代码变得简洁可读。下面我们就来一一介绍这些函数的使用。

(1)compile(pattern)函数

       Python中re模块为我们提供了compile(pattern)函数,参数pattern是一个正则表达式,调用函数compile(pattern)对正则表达式进行编译后得到一个正则对象,使用正则对象匹配模式子串时可以大大提高匹配的效率。当我们需要频繁的匹配一个字符串时,可以使用compile(pattern)函数,代码例子如下:

       

import re
reobject=re.compile(r"hello")
print(reobject.findall("hello world"))


        如上调用re模块的compile(pattern)函数对模式子串"hello"进行编译得到正则对象reobject,返回的正则对象reobject再调用findall(string)方法进行正则匹配。代码打印结果如下:

        

 (2)match(string)和search(string)函数

       之前介绍过使用正则对象可以高效率的进行匹配,match(string)和search(string)就是正则对象常用的两个方法。match(string)是只在主串string的开始位置匹配模式子串,而search(string)是在主串string中匹配所有的模式子串。代码例子如下:

       

import re
reobject=re.compile(r"hello")
print(reobject.match("hello world"))
print(reobject.match("world hello"))

       如上所示,对正则表达式r"hello"进行编译得到正则对象reobject,reobject再调用match(string)方法查询主串是否是以模式子串"hello"开头,如果是则返回一个match对象,否则返回None。代码打印结果如下:

        

        如上打印结果,主串"hello world"以"hello"开头返回一个match对象,"world hello"不是以"hello"开头返回的是None。

        下面看一个调用函数search(string)的例子,如下:

         

import re
reobject=re.compile(r"hello")
print(reobject.search("hello world"))
print(reobject.search("world hello world"))
print(reobject.search("world world world"))

         如上为使用正则对象对模式子串"hello"进行匹配,调用的是search(string)方法,如果主串string中存在"hello"则返回一个match对象,否则返回None。代码打印结果如下:

        

 (3)findall(string)函数

       正则对象还可以调用的一个函数就是findall(string)函数,其返回结果和功能与re模块中的findall(string)函数是相同的,都是查找主串中包含的所有模式子串,然后封装在列表中返回。代码例子如下:

       

import re
s1="^\d{3}-\d{8}$"
reObject=re.compile(s1)
print(reObject.findall("0100-123456789"))
print(reObject.findall("010-123456789"))
print(reObject.findall("010-12345678"))

       如上,正则对象reObject对应的模式子串为一个3位数字区号开头,8位数字号码结尾的电话号码,调用findall(string)方法打印结果如下:

        

 (4)正则表达式中"\"转义的注意事项

        之前我们在书写正则表达式时,都是直接把正则表达式当做字符串的形式来写,如r="\d\d\d"用于匹配3个数字字符,这样写在匹配大多数模式子串时是没有问题的。但是存在一个隐患,就是匹配普通字符"\"时会出现问题。如下:

       

import re
s4=re.compile("\\d")
print(s4.findall("\8d\d"))

        如上正则表达式为"\\d",我们想匹配的一个模式子串为"\d",打印结果如下:

        

       可以看到并没有匹配到模式子串"\d",而是匹配到了数字8。这是因为转义字符在正则表达式"\\d"中进行了多次转义,"\\d"第一次转义后为"\d","\d"转义后为一个数字字符。那么怎么解决转义字符"\"多次转义的问题呢?只要规范的书写正则表达式就没有问题了,正则表达式规范的书写方法为:r+字符串。如:r"\\d",这样书写Python就会把r"\\d"看做一个正则表达式,转义时只会转义一次,匹配的模式子串为"\d"。如下:

        

import re
s3=re.compile(r"\\d")
print(s3.findall("\8\d\\d"))

如上在字符串"\8\d\\d"匹配字符串"\\d",打印结果如下:

        

 (5)通配符"."

             在正则表达式中,通配符"."可以用于表示任意一个字符。如正则表达式r"he..o"可以表示模式子串"hello","he&&o","herro"等等。

 (6) 函数sub(pattern,repl,string)与函数subn(pattern,repl,string)

       这二者同样是re模块提供的函数,二者的功能都为查询主串中的模式子串,并在主串中将查询到的模式子串用新字符串替换掉,参数pattern为正则表达式,string为待匹配的主串,repl为用于替换的新串。如下代码:

       

import re
rs=r"he..o"
print(re.sub(rs,"hi","hello world,hello myGF"))
print(re.subn(rs,"hi","hello world,hello myGF"))

       如上所示,两个函数将把rs="he..o"能在"hello world,hello myGF"匹配到的模式子串替换为新串"hi"。打印结果如下:

       

             如上结果,函数sub(pattern,repl,string)返回的是替换之后的字符串,而subn(pattern,repl,string)返回的是一个元组,元组包含了替换之后的字符串和替换的次数.

(7)splite(pattern,string,maxsplite)函数

      函数splite(pattern,string,maxsplite)的功能为将字符串string分割为若干子串,并封装在列表中返回,正则表达式pattern中存放着分隔符,maxsplite控制分割的最大次数。代码例子如下:

      

import re
rs="[\+\-\*]"
print(re.split(rs,"111+222*333-444",1))
print(re.split(rs,"111+222*333-444",2))
print(re.split(rs,"111+222*333-444",3))

      如上rs="[\+\-\*]",分隔符为"+","-","*",当在主串中匹配到分隔符时,就会发生一次分割。maxsplite为分割的最大次数。例如主串"111+222*333-444"指定maxsplite=1,即从左至右只分割一次,分割后的字符串为"111"和"222*333-444",打印结果如下:

      

 (8)finditer(pattern,string)函数

       函数finditer(pattern,string)与findall(pattern,string)的功能是相同的,都是匹配主串中所有的模式子串并返回,不同的是返回结果不同。findall(pattern,string)返回的是一个字符串列表,而finditer(pattern,string)返回的是一个迭代器。代码如下:

      

import re
s1="hello"
fil=re.finditer(s1,"hello world,hello myGF")
print(fil)

        打印结果如下:

         

        迭代器fil中的元素为match对象,通过match对象我们可以获得更加详细的匹配信息。如下:

        

import re
s1="hello"
fil=re.finditer(s1,"hello world,hello myGF")
for i in fil.__iter__():
    print(i)
    print(i.group())
    print(i.span())
    print("start:",i.start())
    print("end:",i.end())

       如上,通过迭代器的__iter__()方法我们可以获取match对象列表并遍历。打印结果如下:

       

       match对象的方法group()返回的是匹配的模式子串;方法span()返回的是匹配到的子串在主串中的位置,方法start()返回匹配的开始位置,方法end()返回的是匹配的结束位置。

      下一节我们将来继续介绍正则表达式的最终篇,正则属性,敬请期待。


     

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值