一、概述
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同。
下图展示了使用正则表达式进行匹配的流程:
正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。
下图列出了Python支持的正则表达式元字符和语法:
二、re模块
re 模块使 Python 语言拥有全部的正则表达式功能,re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
(一)re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
函数语法:
re.match(pattern, string, flags=0)
函数参数说明:
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
匹配成功 re.match 方法返回一个匹配的对象,否则返回 None。
我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
举例说明:
import re
print (re.match('hello','hello xiaofeng dada').span()) #在起始位置匹配
print (re.match('dada','hello xiaofeng dada'))#没有在起始位置配置
chuhe = "I love china very very very love"
match = re.match(r'(.*) love (.*?) .*',chuhe,re.M|re.I)
if match:
print ('match.group():',match.group())
print ('match.group(1):',match.group(1))
print ('match.group(2):',match.group(2))
else:
print ("啥也没匹配到!")
输出结果:
(二)re.search方法
re.search 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
函数语法:
re.search(pattern, string, flags=0)
函数参数说明:
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
匹配成功 re.research 方法返回一个匹配的对象,否则返回 None。
我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
举例说明:
import re
print (re.search('hello','hello xiaofeng dada').span())#在起始位置进行配置
print (re.search('dada','hellow xiaofeng dada').span()) #没有在起始位置配置
chuhe = "I love china very very very love"
match = re.search(r'(.*) love (.*?) .*',chuhe,re.M|re.I)
if match:
print ('match.group():',match.group())
print ('match.group(1):',match.group(1))
print ('match.group(2):',match.group(2))
else:
print ("啥也没匹配到!")
输出结果:
(三)re.match与re.search的区别
re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None; 而re.search匹配整个字符串,直到找到一个匹配。
举例说明:
chuhe = "I love china very very very love"
match = re.match(r'china',chuhe,re.M|re.I)
if match:
print ("匹配到了:",match.group())
else:
print ("啥也没匹配到!")
match = re.search(r'china',chuhe,re.M|re.I)
if match:
print ("匹配到了:",match.group())
else:
print ("啥也没匹配到!")
输出结果:
(四)检索和替换——re.sub
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
举例说明:
smartphone = '15195371573 ——#小编的手机号码'
num = re.sub(r'#.*$'," ",smartphone)
print(num)
number = re.sub(r'\D',"",smartphone)#替换非数字以外所有字符
print (number)
输出结果: