python3正则表达式
正则表达式是一个特殊的字符,它能帮助你方便的检查一个字符串是否与某种模式匹配
。
re模块使python语言拥有全部的正则表达式功能
compile()函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。
该对象拥有一系列方法用于正则表达式匹配和替换
。
re模块也提供了与这些方法功能
完全一致的函数,这些函数使用一个模式字符串作为它们的第一个参数。
import re
re.match(pattern,string,flag=0)
pattern : 匹配的正则表达式
string : 要匹配的字符串
flags : 标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等等
匹配成功re.match方法返回一个匹配的对象,否则返回None
可以使用group(num)或者groups()匹配对象函数来获取匹配表达式
group(num=0) : 匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应的元组
groups() 返回一个包含所有小组字符串的元组,从1到所含的小组号
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
'''
(0, 3)
None #"com"与"www"不匹配
'''
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('.*com', 'www.runoob.com').span()) # 不在起始位置匹配
'''
(0, 3)
(0, 14) # .* : www.runoob.
'''
正则表达式修饰符-可选标志
re.l 使匹配对大小写不敏感
re.L 做本地化识别匹配
re.M 多行匹配,影响^和$
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w,\W,\b,\B
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
'''
(.*) : Cats
are : are
(.*?) : smater
.* : than dogs
'''
print("matchObj.group() : ", matchObj.group())
print("matchObj.group(1) : ", matchObj.group(1))
print("matchObj.group(2) : ", matchObj.group(2))
print("matchObj.groups() : ", matchObj.groups())
'''
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
matchObj.groups() : ('Cats', 'smarter')
'''
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
matchObj = re.match(r'(.*) are (.*?) ', line, re.M | re.I)
'''
(.*) : Cats
are : are
(.*?) : smater
'''
print("matchObj.group() : ", matchObj.group())
print("matchObj.group(1) : ", matchObj.group(1))
print("matchObj.group(2) : ", matchObj.group(2))
print("matchObj.groups() : ", matchObj.groups())
'''
matchObj.group() : Cats are smarter
matchObj.group(1) : Cats
matchObj.group(2) : smarter
matchObj.groups() : ('Cats', 'smarter')
'''
re.search()
re.search(pattern,string,flags=0)扫描整个字符串并返回第一个成功的匹配
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
'''
(0, 3)
(11, 14)
'''
import re
line = "Cats are smarter than dogs"
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)
if searchObj:
print("searchObj.group() : ", searchObj.group())
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.group(2) : ", searchObj.group(2))
print("searchObj.groups() : ", searchObj.groups())
else:
print("Nothing found!!")
'''
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
searchObj.groups() : ('Cats', 'smarter')
'''
re.match() 与 re.search() 的区别
re.match() 只匹配字符串的开始
如果字符串不符合正则表达式,则匹配失败,函数返回none
re.search()匹配整个字符串,直至找到一个匹配
import re
str0="ajgsdjhkahfbACJKSbweuiegfhibJASHBcjhbusdfgyuvhjfbkzaowsijeuwgfhrvbzsdbhgaesrqwybejkunfak"
print(re.search("gfhibjash",str0,re.I).span()) #从0开始
#(23, 32)
print(re.search("gfhibjash",str0))
#None
import re
str0="ajgsdjhkahfbACJKSbweuiegfhibJASHBcjhbusdfgyuvhjfbkzaowsijeuwgfhrvbzsdbhgaesrqwybejkunfak"
print(re.match("ajGsDJhkahfbA",str0,re.I).span())
#(0, 13)
print(re.match("jGsDJhkahfbA",str0,re.I))
#None
检索和替换
re.sub(pattern,repl,string,count=0,flags=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 编译时用的匹配模式,数字形式。
import re
phone = "2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print("电话号码 : ", num)
'''
电话号码 : 2004-959-559
电话号码 : 2004959559
'''