目录
(2)x+:表示它前面的字符可以出现一次以上;(+只可以匹配多次)
(4)x{2,5}:指定字符出现次数的范围,x{2,} :字符x出现2次以上;
(1)(x|y):匹配字符x或y。(xy)|(ab):匹配 xy 或ab;
一、打开正则表达式
1、快捷键 Ctrl+R,将替换功能调出来且图中红框的位置一定要点亮,才可以使用正则表达式;
二、正则表达式的使用
1、限定符
(1)x*:*表示它前面的字符y 可以有0个或多个;
(2)x+:表示它前面的字符可以出现一次以上;(+只可以匹配多次)
(3)x{}:精确指定一个字符x出现了多少次;
(4)x{2,5}:指定字符出现次数的范围,x{2,} :字符x出现2次以上;
(5)x?:字符x出现0次或1次;
2、运算符
(1)(x|y):匹配字符x或y。(xy)|(ab):匹配 xy 或ab;
3、字符类
[abc]+:表示匹配的字符只能取自abc
[a-z]表示所有的小写字母
[a-zA-Z]表示所有的英文字母
[a-zA-Z0-9]表示所有的英文字母和数字
[^a-zA-Z0-9]表示匹配除了尖号后面列出的所有字符之外的符号
4、元字符
正则里面的元字符基本上是以反斜杠开头的;
5、贪婪匹配和懒惰匹配
<.+>:贪婪匹配任意字符,不包括换行符
<.+?>:懒惰匹配任意字符
三、正则表达式实际应用-Python实现
注:需要用到 re 模块
1、re.finadll 用法
re.findall('.+', 'abc\ndef\nghi\n') # 第一个参数是正则表达式,第二个参数是需要匹配的字符串 运行结果:['abc', 'def', 'ghi']
print(re.findall('.+', 'abc\ndef\nghi\n',flags=re.DOTALL)) # flags=re.DOTALL表示匹配所有的字符 运行结果:['abc\ndef\nghi\n']
查阅官方资料:
1)浏览器搜索 Python re flags;
2)找到官网并点击;
2、re.search 用法
# 用法与findall一样,唯一不同的是返回值;它只会匹配符合规则的第一个值,且返回的是一个Match对象。如果匹配不到,则返回NOne;
print(re.search('\d{3,4}', 'Tel-028-7654321'))
print(re.search('[a-z]{4,5}', 'Tel-028-7654321'))
运行结果:
<re.Match object; span=(4, 7), match='028'>
None
3、.group 用法
res = re.search('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321') print(res.group()) print(res.group(1)) print(res.group(2))
运行结果:
028-7654321
028
7654321
4、re.finditer 用法
功能:匹配所有符合规则的内容,并处理成迭代器返回;
res = re.finditer('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321 Tel-059-0123467')
print(res)
for m in res:
print(m.group())
# print(m.group(1))
# print(m.group(2))
运行结果:
<callable_iterator object at 0x0000021E7D812E60>
(1)group无参数:
028-7654321
059-0123467(2)group参数为1:
028
059(3)group参数为2:
7654321
0123467
补充:
# 迭代器,不依赖于索引的迭代取值方式
迭代就是重复,每一次的重复都是在上一次的基础上
详细请读python-迭代器
5、re.match 和 re.fullmatch 用法
re.match与re.seach用法一样,也是只匹配符合规则的第一个值,并返回Match对象。
但它只能匹配字符串的开头,若匹配不到返回None;
re.fullmatch ,从头匹配到尾,也就是进行匹配整个字符串,若成功返回Match对象,否则返回None;
6、re.sub 和 re.subn 用法
re.sub功能:将匹配到的内容替换成其他内容;可以穿字符串,函数地址
(1)传字符串
res = re.finditer('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321 Tel-059-0123467') for m in res: print(m.group()) print(re.sub('(\d{3,4})-(\d{7,8})', '***', 'Tel-028-7654321 Tel-059-0123467'))y
运行结果:
028-7654321
059-0123467
Tel-*** Tel-***
(2)传内存地址 - sub功能每匹配到一个值,就会得到一个Match对象,然后调用我们传的函数,并把Match对象传给他。
脱敏后的电话号码---运于外卖上
def des(m): # 这里是为了sub调用函数,传对象给函数,这里m接收Match对象
print(f'group(1):',m.group(1))
tel = m.group(2)
print(f'group(2):',tel)
return tel[:2] + '***' + tel[-2:] # tel[:2]得到tel的前两位,tel[-2:]得到后两位
print(re.sub('(\d{3,4})-(\d{7,8})', des, 'Tel-028-7654321 Tel-059-0123467'))
运行结果:
group(1): 028
group(2): 7654321
group(1): 059
group(2): 0123467
Tel-76***21 Tel-01***67
re.subn功能与re.sub一样,多返回了一个替换的次数
上面的例子
def des(m): tel = m.group(2) return tel[:2] + '***' + tel[-2:] print(re.subn('(\d{3,4})-(\d{7,8})', des, 'Tel-028-7654321 Tel-059-0123467'))
运行结果;
('Tel-76***21 Tel-01***67', 2)
7、re.split 用法
作用:把正则匹配到的内容作为分隔符进行拆分
s = 'xyg,- time, !dog, cat'
# 传统的拆分
print(f'传统拆分:', s.split(','))
print(re.split('\w', s)) # \w 匹配单词字符(包括字母、数字和下划线)
print(re.split('\W', s)) # \W 匹配非单词字符
print(re.split('\W+', s)) # \W+ 加上+ 表示只匹配的字符只能取自W
运行结果:
传统拆分: ['xyg', '- time', ' !dog', ' cat']
['', '', '', ',- ', '', '', '', ', !', '', '', ', ', '', '', '']
['xyg', '', '', 'time', '', '', '', 'dog', '', '', 'cat']
['xyg', 'time', 'dog', 'cat']
8、re.compile 用法
功能:传给它一个正则表达式,它会返回一个正则表达式对象;主要用于一个正则表达式被多次使用时。
res = re.compile('.*') print(res.findall('Tel-028-7654321 Tel-059-0123467'))
运行结果:
['Tel-028-7654321 Tel-059-0123467', '']
9、正则表达式实际运用
(1)匹配手机号
phone_num = '''
125163251489
15812569487
15536854456
15587452256
15520361197
ab153023697
141111111111
12348567954
136489651035
13845620147
163258953255551
'''
print(re.findall(r'\b(13[0-9]|14[5-9]|15[0-35-9])\d{8}\b', phone_num))
print(re.findall(r'\b(?:13[0-9]|14[5-9]|15[0-35-9])\d{8}\b', phone_num))
# 加r:防止转义
# \b 标注字符的边界
# \d 匹配数字字符
# x{y} x字符出现y次
# x{a,b} 指定字符出现次数的范围
# 在编程语言中使用正则,如果正则表达式中出现小括号,那编程语言会把小括号视作匹配边界;也就是说会把小括号里面的内容视为一个group
# 解决方法:在小括号内的最前面加上?:,这样可以申明这个小括号不是一个group
运行结果:
['158', '155', '155', '155', '138']
['15812569487', '15536854456', '15587452256', '15520361197', '13845620147']
(2)将字符串转成字典格式
思想:
第一组:group(1)
第二组:group(2)
s = '''
Host: movie.douban.com
Pragma: no-cache
Referer: https://cn.bing.com/
'''
dic = {}
res = re.finditer('(.*): (.*)', s)
# .*:*表示它前面字符.可以有0个或多个
# : 冒号后面加空格,会因为字符串s中,冒号后面有空格
for m in res: # res写了两个小括号,就是两组小括号
# print(m.group(1))
# print(m.group(2))
dic[m.group(1)] = m.group(2) # 填充到字典中
print(dic)
运行结果:
{'Host': 'movie.douban.com', 'Pragma': 'no-cache', 'Referer': 'https://cn.bing.com/'}