比尔云BierYun--阿里云最新优惠活动
阿里云优惠码丨阿里云代金券

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

python学习(18)–正则表达式3http://www.bieryun.com/2355.html

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

(1)compile(pattern)函数

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

 

[python] view plain copy

  1. import re
  2. reobject=re.compile(r“hello”)
  3. 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中匹配所有的模式子串。代码例子如下:

 

[python] view plain copy

  1. import re
  2. reobject=re.compile(r“hello”)
  3. print(reobject.match(“hello world”))
  4. print(reobject.match(“world hello”))

 

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

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

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

 

[python] view plain copy

  1. import re
  2. reobject=re.compile(r“hello”)
  3. print(reobject.search(“hello world”))
  4. print(reobject.search(“world hello world”))
  5. print(reobject.search(“world world world”))

 

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

(3)findall(string)函数

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

 

[python] view plain copy

  1. import re
  2. s1=“^\d{3}-\d{8}$”
  3. reObject=re.compile(s1)
  4. print(reObject.findall(“0100-123456789”))
  5. print(reObject.findall(“010-123456789”))
  6. print(reObject.findall(“010-12345678”))

 

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

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

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

 

[python] view plain copy

  1. import re
  2. s4=re.compile(“\\d”)
  3. print(s4.findall(“\8d\d”))

 

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

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

 

[python] view plain copy

  1. import re
  2. s3=re.compile(r“\\d”)
  3. 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为用于替换的新串。如下代码:

 

[python] view plain copy

  1. import re
  2. rs=r“he..o”
  3. print(re.sub(rs,“hi”,“hello world,hello myGF”))
  4. 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控制分割的最大次数。代码例子如下:

 

[python] view plain copy

  1. import re
  2. rs=“[\+\-\*]”
  3. print(re.split(rs,“111+222*333-444”,1))
  4. print(re.split(rs,“111+222*333-444”,2))
  5. 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)返回的是一个迭代器。代码如下:

 

[python] view plain copy

  1. import re
  2. s1=“hello”
  3. fil=re.finditer(s1,“hello world,hello myGF”)
  4. print(fil)

 

打印结果如下:

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

 

[python] view plain copy

  1. import re
  2. s1=“hello”
  3. fil=re.finditer(s1,“hello world,hello myGF”)
  4. for i in fil.__iter__():
  5.     print(i)
  6.     print(i.group())
  7.     print(i.span())
  8.     print(“start:”,i.start())
  9.     print(“end:”,i.end())

 

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

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

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

未经允许不得转载:比尔云 » python学习(18)–正则表达式3
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

强烈推荐

高性能SSD云服务器ECS抗攻击,高可用云数据库RDS