- 正则表达式
- 正则表达式之字符组
- 正则表达式之特殊符号
- 正则表达式之量词
- 贪婪匹配与非贪婪匹配
- 取消转移
正则表达式是单独的一门学科 主要的作用是在编写处理字符串的时候,有时会去查找一些有着复杂规则的字符串,用正则使用一些符号的组合产生特殊的含义,帮助我们去查找筛选到符合条件的数据
###正则表达式之字符组
import re
"""可以在中括号内填入任意数据值,数据值之间都是或的关系"""
# [0-9] 匹配从0到9任意一个数字,是[0123456789]的简写
res = re.findall('[0-9]', 'aAbBcCdD1234')
print(res) # ['1', '2', '3', '4']
# [a-z] 匹配从a到z任意一个字母,是[abcd...xyz]的简写
res = re.findall('[a-z]', 'aAbBcCdD1234')
print(res) # ['a', 'b', 'c', 'd']
# [A-Z] 匹配从A到Z任意一个字母,是[ABCD...XYZ]的简写
res = re.findall('[A-Z]', 'aAbBcCdD1234')
print(res) # ['A', 'B', 'C', 'D']
# [0-9a-zA-z] 匹配从0到9从a到z从A到Z之间任意一个字符
res = re.findall('[0-9a-zA-z]', 'aAbBcCdD1234')
print(res) # ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', '1', '2', '3', '4']
"""在没有使用量词的情况下,默认一次查找一个数据值"""
正则表达式之特殊符号
import re
# . 匹配除了换行符以外的任意字符
res = re.findall('.', 'aAbBcCdD1234_一二三')
print(res) # ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', '1', '2', '3', '4', '_', '一', '二', '三']
# w 匹配数字字母或下划线
res = re.findall('w', 'aAbBcCdD1234_一二三')
print(res) # ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', '1', '2', '3', '4', '_', '一', '二', '三']
# W 匹配除了数字字母或下划线以外的字符
res = re.findall('W', 'aAbBcCdD1234_一二三n')
print(res) # ['n']
"""w匹配的是能组成单词的字符,在python3 中re默认支持的是unicode字符集,当然也支持汉字。"""
# d 匹配数字
res = re.findall('d', 'aAbBcCdD1234_一二三')
print(res) # ['1', '2', '3', '4']
# D 匹配数字以外的字符
res = re.findall('D', 'aAbBcCdD1234_一二三')
print(res) # ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', '_', '一', '二', '三']
# ^ 匹配字符串开头
res = re.findall('^a', 'aAbBcCdD1234_一二三')
print(res) # ['a']
# $ 匹配字符串结尾
res = re.findall('三$', 'aAbBcCdD1234_一二三')
print(res) # ['三']
# a|b 匹配a或者b
res = re.findall('b|D','aAbBcCdD1234_一二三')
print(res) # ['b', 'D']
# () 给正则表达式分组和捕获
txt = '17112345678 18112345678 19112345678'
res = re.findall('171|181d{8}', txt)
print(res) # ['171', '18112345678']
"""没有分组,181d{8}被看做一个整体"""
res1 = re.findall('(171|181)d{8}', txt)
print(res1) # ['171', '181']
"""因为()的捕获优先提取,所以导致d{8}失效"""
res1 = re.findall('(?:171|181)d{8}', txt)
print(res1) # ['17112345678', '18112345678']
"""使用?:取消捕获"""
# [] 匹配字符组中的字符
# [^] 匹配除了字符组中的其他字符
res = re.findall('[^abc]','aAbBcCdD1234_一二三')
print(res) # ['A', 'B', 'C', 'd', 'D', '1', '2', '3', '4', '_', '一', '二', '三']
| 符号 | 说明 |
|---|---|
| . | 通配符,代表除换行符以外任意字符 |
| w | 匹配字母或数字或下划线 |
| W | 与w相反 |
| d | 匹配数字 |
| D | 与d相反 |
| ^ | 匹配开头字符 |
| $ | 匹配结尾字符 |
| | | 管道符,表示或 |
| () | 分组和捕获 |
| [] | 匹配中括号中的字符 |
| [^] | 匹配中括号以外的字符 |
import re
"""
在正则表达式中,量词默认都是贪婪匹配
量词不能单独使用,需要跟在表达式后,只会影响到左边那一个
"""
txt = 'aaaaaaabaaa'
# * 重复0次或多次
res = re.findall('a*',txt)
print(res) # ['aaaaaaa', '', 'aaa', '']
# + 重复1次或多次
res = re.findall('b+',txt)
print(res) # ['aaaaaaa', 'aaa']
# ? 重复0次或1次
res = re.findall('a?',txt)
print(res) # ['a', 'a', 'a', 'a', 'a', 'a', 'a', '', 'a', 'a', 'a', '']
# {n} 重复n次
res = re.findall('a{3}',txt)
print(res) # ['aaa', 'aaa', 'aaa']
# {n,} 重复n次及以上
res = re.findall('a{3,}',txt)
print(res) # ['aaaaaaa', 'aaa']
# {n,m} 重复最少n次最多m次
res = re.findall('a{3,5}',txt)
print(res) # ['aaaaa', 'aaa']
# {,m} 重复最多m次
res = re.findall('a{,6}',txt)
print(res) # ['aaaaaa', 'a', '', 'aaa', '']
| 量词 | 说明 |
|---|---|
| * | 重复0个或多个 |
| + | 重复1个或多个 |
| ? | 重复0个或1个 |
| {n} | 重复n次 |
| {n,} | 重复n次及以上 |
| {n,m} | 重复n次以上,m次一下 |
| {,m} | 重复最多m次 |
"""
所有的量词默认都是贪婪匹配的,既尽可能多的匹配
如果在量词的后面加上一个问号,那么就会变成非贪婪匹配,既尽可能少的匹配
"""
txt = ''
# 贪婪匹配:
res = re.findall('<.*>', txt)
print(res) # ['']
# 非贪婪匹配:
res = re.findall('<.*?>', txt)
print(res) # ['']
取消转移
在正则表达式中取消转义符与字母之间的特殊含义,就是在转义符前再加一个转义符,取消后一个转义符的作用
n 对应 n
\n 对应 n
在python中,可以直接在字符串前加r
可以使字符串中转义字符取消转义
import re print(re.findall(r'n', 'n')) # ['n'] print(re.findall(r'\n', '\n')) # ['\n']



