调用re模块,举两个简单的例子介绍re.match(),re.search(),re.findall(),re.sub()
import re
msg = 'aabbccddaa'
r = re.match('aa', msg) # 从头匹配,不成功返回none,匹配即停止
print(r)
r = re.findall('aa', msg) # 全局查找所有的匹配项
print(r)
r = re.search('bb', msg) # 全局查找,匹配即停止
print(r)
print(r.span()) # 获取匹配位置
print(r.group()) # 获取匹配内容
msg = 'aabbccddaa'
r = re.sub(r'aa', 'zz', msg) # 将字符串中的'aa'替换成'zz'
print(r)
<re.Match object; span=(0, 2), match='aa'>
['aa', 'aa']
<re.Match object; span=(2, 4), match='bb'>
(2, 4)
bb
zzbbccddzz
正则符号:
. 匹配除换行符以外的任意字符
^ 以...开头
$ 以..结尾
[] 表示范围,例如:[123abc]中的一种 [^] 取非
正则预定义:
\s 匹配空格 \S 非空格
\b 边界
\d 数字 \D 非数字
\w [0-9a-zA-Z_] \W 非数字字母下划线
正则验证次数:
* 匹配0次或以上
+ 匹配1次或以上
? 匹配0次或1次
{m} 准确匹配m次
{m,} 匹配m次或以上
{m,n} 匹配m次或以上,n次或以下
使用 ()对正则进行分组
import re
email = '408389367@qq.com'
r = re.match(r'\w{1,20}@(qq|163|126)\.com$', email) # 使用()对正则进行分组,|表示或者
print(r)
phone = '010-12345678'
r = re.match(r'(\d{3}|\d{4})-(\d{8})$', phone)
print(r.group(1)) # 通过group提取指定分组的值
print(r.group(2))
msg = '<html>hello</html>'
r = re.match(r'<(\w+)>(.+)</\1>', msg) # 通过\数字的格式,在正则表达式中引用上一个组
print(r.group(2))
<re.Match object; span=(0, 16), match='408389367@qq.com'>
010
12345678
hello
通过给分组起名的方式使用分组
import re
# 起名的方式: (?P<名字>正则) (?P=名字)
msg = '<html><h1>abc</h1></html>'
r = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>',msg)
print(r)
<re.Match object; span=(0, 25), match='<html><h1>abc</h1></html>'>
re.sub()与re.split函数
def func(temp): # 定义一个函数,将正则匹配出来的项加1并返回
num = temp.group()
num1 = int(num) + 1
return str(num1)
r = re.sub(r'\d+', func, '99,100,101') # 将替换值设置为我们提前定义的函数
print(r)
r = re.split(r'[,.]', 'yang,lu.peng') # 将正则表达式中匹配项当做分隔符,以列表形式将分割后的字符串保存
print(r)
100,101,102
['yang', 'lu', 'peng']
贪婪匹配/惰性匹配
默认为贪婪匹配,通过?将贪婪模式修改为惰性模式
import re
msg = 'abc123184113'
r = re.match(r'abc\d+', msg)
print(r)
r = re.match(r'abc\w+?', msg)
print(r)
<re.Match object; span=(0, 12), match='abc123184113'>
<re.Match object; span=(0, 4), match='abc1'>