python——正则表达式(一)

一、概述

正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同。

下图展示了使用正则表达式进行匹配的流程:

python——正则表达式(一)

正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。

下图列出了Python支持的正则表达式元字符和语法: 

python——正则表达式(一)

python——正则表达式(一) 

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 ("啥也没匹配到!")

输出结果:python——正则表达式(一)


 (二)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 ("啥也没匹配到!")

输出结果:python——正则表达式(一)


(三)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 ("啥也没匹配到!")

输出结果:python——正则表达式(一)


(四)检索和替换——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)

输出结果:python——正则表达式(一)

 

 

 

 

上一篇:python re 的使用


下一篇:解决报错Error response from daemon: rpc error: code = Unavailable desc = all SubConns are in TransientFa