正则表达式:
-
正则表达式是使用一系列特殊符号中从字符串中匹配内容
-
正则表达式是独立于所有语言的语法,所有语言中正则表达式的语法是相同的,只是使用方式不一样
匹配符号:
- .(点) 通配符:可以匹配任意一个字符
- \d:匹配0-9数字
- \D:匹配非数字
- 普通符号:在正则表达式中没有特殊含义的符号
- \s:匹配空白符号(空格,\n,\t,\v等)
- \S:匹配非空白字符
- \w: 匹配数字、字母、下划线、中文、朝鲜语
- [字符集]:从[]字符集中匹配一个字符
- [^字符集]:匹配不在字符集中的元素
- 字符集的规则没有变,必须在字符集的最开头添加,否则他就表示他自己了
常见的字符集:
1 [a-z]:表示匹配小写字母中的任意一个字母
2 [A-Z]:表示匹配大写字母中的任意一个字母
3 [0-9]:表示匹配0-9数字中的任意一个
4 [\u4e00-\u9fa5]:匹配任意一个汉字
5 [a-zA-Z]:表示匹配字母中的任意一个字母
6 [0-9a-zA-Z\u4e00-\u9fa5]:匹配任意一个汉字、字母、数字
7 [012345678-] 匹配0-8或者-其中的一个
# 1. .(点) 通配符:可以匹配任意一个字符
re_str = 'a.b'
# str1 = 'abc'
str1 = 'acb'
result1 = re.fullmatch(re_str, str1)
# print(result1)
# print(result1.span())
# 2. \d:匹配0-9数字
# 3. \D:匹配非数字
# re_str2 = 'a\d\dc'
re_str2 = 'a\D\Dc'
# str2 = 'a12c'
str2 = 'abcc'
result2 = re.fullmatch(re_str2, str2)
# print(result2)
# 4.普通符号:在正则表达式中没有特殊含义的符号
re_str = 'abcd'
str3 = 'abcd'
re.fullmatch(re_str, str3)
# 5. \s:匹配空白符号(空格,\n,\t,\v等)
# 6. \S:匹配非空白字符
print(re.fullmatch(r'a\sb', 'a\nb'))
print(re.fullmatch(r'a\Sb', 'acb'))
# 7. \w: 匹配数字、字母、下划线、中文、朝鲜语
# 8. [字符集]:从[]字符集中匹配一个字符
# 字符集规则:-连接的是范围,-左边必须小于右边,-不能出现在字符集开头
print(re.fullmatch('[a-zA-Z][a-zA-Z]', 'az'))
# 9.[^字符集]:匹配不在字符集中的元素
# 字符集的规则没有变,必须在字符集的最开头添加,否则他就表示他自己了
print(re.fullmatch('[^a-zA-Z][a-zA-Z][a-z^A-Z]', '1z^'))
# findall(正则表达式,字符串):
# 1.从字符串中按照正则表达式的规则匹配所有可能,并放到列表中
# 2. 如果正则表达式中出现了分组,它只拿分组的内容
print(re.findall(r'\d', 'a1b3d45f6j7'))
正则中表示重复的符号:
- ?:匹配0次或1次
- +:匹配1次或多次
- *:匹配任意次数
- {m} 匹配m次
- {m,n} 匹配m到n次
- {m,} 匹配至少m次
- {,m} 最多匹配m次
贪婪和非贪婪:
- 默认所有次数不确定的匹配都是贪婪的
- 非贪婪就是一次匹配取最短长度的结果,在非贪婪涉及的符号的基础上添加一个?即可,+?,*?,{m,n}?等
分组和分支:
- 分支:|
分组:()
- 能够将同类项提出来
- 能够将分组中的结果重复
- 如果字符串后面再次出现前面匹配过的结果,可以将前面的结果使用分组包围起来,
- 结合\N(N是数字,代表第N个分组)的语法,可以将前面第N个分组的结果重复使用
- 正则表达式不是转义字符,在写正则表达式时,在正则表达式前面添加r或者是R
import re
# 分支:|
# . 通配符放在[]中特殊意义消失
print(re.findall(r'[a-z]{3}', 'abcabd'))
print(re.findall(r'abc|abd', 'abcabd'))
# 分组:()
# 1.能够将同类项提出来
# 2. 能够将分组中的结果重复
print(re.findall(r'(abc|abd)', 'abcabd'))
# (ab(c|d))(abc) (ab(c|d))-->第一个分组 (c|d)第二个分组 (abc)第3个分组
# 如果字符串后面再次出现前面匹配过的结果,可以将前面的结果使用分组包围起来,
# 结合\N(N是数字,代表第N个分组)的语法,可以将前面第N个分组的结果重复使用
print(re.fullmatch(r'(\d{4})(=)\2\1\1', '1234==12341234'))
# 正则表达式不是转义字符,在写正则表达式时,在正则表达式前面添加r或者是R
有关方法:fullmatch/findall/split/sub/search/match(常用:findall split sub)
- fullmatch:查看整个字符串是否符合正则表达式 可能出现None
- findall:
- 从字符串中按照正则表达式的规则匹配所有可能,并放到列表中
- 如果正则表达式中出现了分组,会先提取符合正则表达式的的结果,然后再拿分组的内容
- split:按照正则表达式的规则切割字符串
- sub:将符合正则表达式的字符串替换为新的字符串
- search:查找字符串中第一个符合正则表达式的结果 可能出现None
- match:查看字符串的开头是否符合正则表达式的规则 可能出现None
print(re.findall(r'[a-z]{3}', 'abcabd'))
print(re.findall(r'abc|abd', 'abcabd'))
print(re.match(r'a', 'a,b.c'))
print(re.search(r'[a-z]', 'a,b.c'))
print(re.split(r'[,.]', 'a,b.c'))
print(re.sub(r'[,.]', '', 'a,b.c'))
a', 'a,b.c'))
print(re.search(r'[a-z]', 'a,b.c'))
print(re.split(r'[,.]', 'a,b.c'))
print(re.sub(r'[,.]', '', 'a,b.c'))