Python学习(17)--正则表达式2

简介: Python学习(17)--正则表达式2 (1)正则表达式的元字符转义"\" 在上一节我们提到,正则表达式中当元字符^位于模式子串的开头时,表示的是查找待匹配主串的开始是否是该模式子串,如果是则返回模式子串,否则返回空。

Python学习(17)--正则表达式2

(1)正则表达式的元字符转义"\"

在上一节我们提到,正则表达式中当元字符^位于模式子串的开头时,表示的是查找待匹配主串的开始是否是该模式子串,如果是则返回模式子串,否则返回空。下面有个例子我们来回顾下:

 

[python] view plain copy

  1. import re
  2. s1="^abc"
  3. print(re.findall(s1,"abcd"))
  4. print(re.findall(s1,"aa abcd"))

 

如上代码正则表达式为s1="^abc",用于匹配主串开头是否为"abc",如果是返回"abc",否则返回空。代码打印结果如下:

在正则表达式中,有时候我们需要匹配的字符串中含有元字符,比如正则表达式中含有"^",而且"^"是正则表达式的首位字符,如下:

 

[python] view plain copy

  1. import re
  2. s1="^abc"
  3. print(re.findall(s1,"^abc ^abc ^abc"))

 

如上s1="^abc","^"位s1的首位,但是s1表示的含义是查询主串的开始字符串是否是"abc",而不是查询主串中是否含有模式子串"^abc"。代码打印结果如下:

 

那么模式子串如果有元字符"^",如果想匹配字符"^"怎么办呢?答案就是利用转义字符"\",把"^"转义成一个普通字符。如下:

 

[python] view plain copy

  1. import re
  2. s1="\^abc"
  3. print(re.findall(s1,"^abc ^abc ^abc"))

 

s1="\^abc","^"被转义成一个普通字符"^",这时模式子串为"^abc",即匹配主串中是否含有字符串"^abc",打印结果如下:

使用转义字符可以方便的表示某些数据,例如\d表示的是一个整数。在上一节使用的是正则表达式[1-9]来匹配一个整数字符,其实一个整数字符的正则表达式也可以表示为[\d],代码如下:

 

[python] view plain copy

  1. import re
  2. s4="x[\d]x"
  3. print(re.findall(s4,"x1x x2x x3x x4x"))

 

如上s4="x[\d]x",[\d]表示数字字符'1'-'9',s4可以匹配到的字符串为"x1x","x2x"...代码

打印结果如下:

\后加其他字符还可以表示不同的含义,如:\d,\D,\w,\W,\s,\S。具体表示的含义如下图所示:

(2)重复{}

正则表达式中的元字符{}表示{}前一个字符重复的次数,{}中只含有一个数时表示的是字符重复的次数,比如{8}表示{8}前面的一个字符重复8次。{}也可以表示一个重复的范围,比如{1,6}表示{1,6}前的一个字符重复1至6次。形如{,y}表示重复次数的区间为[0,y],{x,}表示重复次数的区间为[x,∞]。

下面以一个电话号码的正则表达式匹配为例,假设一个电话号码前3位为区号,后8位为电话号码,区号与电话号码之间用符号"-"隔开。如下的正则表达式可以匹配电话号码

,代码例子如下:

 

[python] view plain copy

  1. import re
  2. s5="\d\d\d-\d\d\d\d\d\d\d\d"
  3. print(re.findall(s5,"010-87654321"))
  4. print(re.findall(s5,"010-8765432"))

 

如上s5匹配的模式子串为前3个字符为数字,后8个字符为数字,中间使用字符"-"隔开。匹配字符串得到的结果如下:

虽然以上匹配得到的结果是正确的,但是书写的正则表达式比较麻烦,而且可读性也不强。使用重复元字符{}可以有效解决这个问题,如下代码:

 

[python] view plain copy

  1. import re
  2. s6="\d{3}-\d{8}"
  3. print(re.findall(s6,"010-"))
  4. print(re.findall(s6,"010-87654321"))
  5. print(re.findall(s6,"010-8765432"))

 

如上s6="\d{3}-\d{8}","\d{3}"表示数字字符重复3次,也就是模式子串以3个数字字符作为开始字符串,"\d{8}"表示模式子串以8个数字字符作为结尾字符串,两个字符串用字符"-"隔开。匹配结果如下所示:

当在正则表达式中使用{}的形式为{x,y}时,表示重复次数区间为[x,y]。如{1,3}为重复次数为区间[1,3]中的任意一个整数。当在主串中进行匹配时,如果字符重复的次数大于y,则会在匹配长度最长的字符串之后,对主串分割后再匹配。代码如下:

 

[python] view plain copy

  1. import re
  2. s13="a{1,3}"
  3. print(re.findall(s13,"b"))
  4. print(re.findall(s13,"a"))
  5. print(re.findall(s13,"aa"))
  6. print(re.findall(s13,"aaa"))
  7. print(re.findall(s13,"aaaa"))

 

如上s13="a{1,3}",能匹配的最长模式子串为"aaa",当在主串"aaaa"中匹配时,匹配到最长模式子串为"aaa",然后把主串"aaaa"分割成"aaa"和"a"后,再使用正则表达式s13对"a"进行匹配,并将所有匹配得到的结果封装在列表中返回。代码打印结果如下:

(3)元字符*

元字符*在正则表达式中使用,表示的是*前的一个字符重复次数为0次到无穷次,重复次数区间为[0,∞],相当于{0,}。代码如下:

 

[python] view plain copy

  1. import re
  2. s7="ab*"
  3. print(re.findall(s7,"a"))
  4. print(re.findall(s7,"ab"))
  5. print(re.findall(s7,"abbbbbb"))

 

如上所示,s7="ab*",*前的一个字符为"b",则"b"在模式子串中重复的次数可以为0到∞次,即s7可以匹配到的字符串为"a","ab","abbb"...代码打印结果如下:

(4)元字符+

在正则表达式中,元字符+与*唯一的不同就是,+在正则表达式中前的一个字符重复的次数至少1次,如正则表达式"abc+",+前的一个字符"c"在匹配的字符串中重复的次数至少一次,重复次数的区间为[1,∞],相当于{1,}。可匹配到的模式子串如"abc","abcc","abccc"...而"ab"是匹配不到的。代码例子如下:

 

[python] view plain copy

  1. import re
  2. s8="ab+"
  3. print(re.findall(s8,"a"))
  4. print(re.findall(s8,"ab"))
  5. print(re.findall(s8,"abbbbb"))

 

如上s8="ab+",元字符"+"前的一个字符为"b",表示"b"在可匹配字符串中可重复出现的次数为1到无穷次,例如,正则表达式s8可匹配的字符串有"ab","abb"等等。代码打印结果如下:

(5)元字符?

在正则表达式中使用元字符?,表示的含义为?前的一个字符重复的次数为1次或者0次,重复次数的区间为[0,1],相当于{0,1}。如下例子:

 

[python] view plain copy

  1. import re
  2. s11="ab?"
  3. print(re.findall(s11,"a"))
  4. print(re.findall(s11,"ab"))
  5. print(re.findall(s11,"abbb"))

 

如上例子,s11="ab?",元字符?前的字符为"b",在可匹配到的模式子串中"b"可以出现的次数为0或者1次,即可匹配到的模式子串为"a"和"ab",代码打印结果如下:

(6)正则表达式的贪婪匹配和非贪婪匹配

在写正则表达式时,我们可以通过元字符?来控制模式子串的匹配是贪婪匹配或者非贪婪匹配。所谓贪婪匹配就是将模式子串匹配的长度最大化,所谓非贪婪匹配就是将模式子串匹配的长度最小化。例如对于正则表达式"ab+",可以匹配到的模式子串长度最小的为"ab",最长的为"abbbb...",而贪婪匹配就是匹配在主串中能够匹配到的最长的子串,非贪婪匹配就是匹配在主串中匹配最短的模式子串。代码例子如下:

 

[python] view plain copy

  1. import re
  2. s11="ab+"
  3. print(re.findall(s11,"ab"))
  4. print(re.findall(s11,"abbbbbb"))
  5. s12="ab+?"
  6. print(re.findall(s12,"ab"))
  7. print(re.findall(s12,"abbbbbb"))

 

如上S11="ab+",是一种贪婪匹配,即会匹配主串中长度最长子串,如"abbbbbb",使用正则表达式s11时在主串可匹配到的最长子串为"abbbbbb";而s12="ab+?",是一种非贪婪匹配,即匹配最短的模式子串,即"ab"。代码打印结果如下:

下一节,我们将继续介绍正则表达式,敬请期待.北工大菜鸟与你一起努力,谢谢大家。

原文地址http://www.bieryun.com/2351.html

相关文章
|
12天前
|
Python
python函数的参数学习
学习Python函数参数涉及五个方面:1) 位置参数按顺序传递,如`func(1, 2, 3)`;2) 关键字参数通过名称传值,如`func(a=1, b=2, c=3)`;3) 默认参数设定默认值,如`func(a, b, c=0)`;4) 可变参数用*和**接收任意数量的位置和关键字参数,如`func(1, 2, 3, a=4, b=5, c=6)`;5) 参数组合结合不同类型的参数,如`func(1, 2, 3, a=4, b=5, c=6)`。
14 1
|
16天前
|
Python
Python文件操作学习应用案例详解
【4月更文挑战第7天】Python文件操作包括打开、读取、写入和关闭文件。使用`open()`函数以指定模式(如'r'、'w'、'a'或'r+')打开文件,然后用`read()`读取全部内容,`readline()`逐行读取,`write()`写入字符串。最后,别忘了用`close()`关闭文件,确保资源释放。
18 1
|
8天前
|
Python
python学习3-选择结构、bool值、pass语句
python学习3-选择结构、bool值、pass语句
|
6天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
17 0
|
7天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
47 0
|
8天前
|
Python
python学习14-模块与包
python学习14-模块与包
|
8天前
|
Python
python学习12-类对象和实例对象
python学习12-类对象和实例对象
|
8天前
|
数据采集 Python
python学习9-字符串
python学习9-字符串
|
8天前
|
Python
python学习10-函数
python学习10-函数
|
8天前
|
存储 索引 Python
python学习7-元组
python学习7-元组