Python基础12
正则表达式应用:
- 判断一个字符串是否匹配给定的格式。如:判断用户注册账号是否满足格式
- 从一个字符串中按指定格式提取数据。如:抓取页面中的连接
# re.findall(pattern, string)
import re
s1 = 'testing123'
s2 = 'Testing123'
r = re.findall("test", s1)
print(r) # ['test']
r = re.findall("test", s2)
print(r) # 拿到空字符
一、元字符
1、普通字符
import re
s = 'testing123\nTesting123'
# 1.普通字符:修饰符re.I: 忽略大小写
r = re.findall('test', s, re.I)
print(r) # ['test', 'Test']
2、通配符 .
2. .通配符:匹配除了“\n" 以外的任何单个字符
s = 'testing123\nTesting123'
r = re.findall(".", s)
print(r)
# 3. re.S 可以匹配换行符\n
r = re.findall(".", s, re.S)
print(r)
3、修饰符^
3.^:匹配输入字符串的开始位置,修饰符re.M多行匹配 OR(|)或 多个修饰符
s = 'testing123\nTesting123\ntest'
print(s)
r = re.findall("^test", s)
r1 = re.findall("^test", s, re.M) # 多行匹配
r2 = re.findall("^test", s, re.I | re.M) # 多个修饰符
print(r)
print(r1)
print(r2)
4、$匹配结束位置
4 $:匹配输入字符串的结束位置
s = 'testing123\nTesting123\ntest'
r = re.findall("testing123$", s) # 必须是结尾 否则为空
pring(r)
r = re.findall("testing123$", s, re.M) # 多行匹配
pring(r)
r = re.findall("testing123$", s, re.M | re.l) #多个修饰符
pring(r)
5、*+?匹配次数
# 5 *+?:匹配前面的子表达式任意次/大于等于1次/零次或一次
# 6 {}匹配前面的子表达式
s1 = "z\nzo\nzoo"
r = re.fingdall("zo*", s1)
r1 = re.fingdall("zo{0,}", s1) 从零开始到无穷大
pring(r) #'z', 'zo', 'zoo'
r = re.fondall("zo+", s1)
r1 = re.fingdall("zo{1, }", s1)
pring(r) #'zo', 'zoo'
r = re.fondall("zo?", s1)
r1 = re.fingdall("zo{0,1}", s1)
pring(r) #'z', 'zo', 'zo'
r1 = re.findall("zo{2}", s1)
pring(r1)
6、[]字符组
# 7 []字符组:内容
s = "test\nTesting\nzoo"
r = re.findall("[oet]", s) # 所有oet 字符
print(r)
r = re.findall("[e-i]", s) # 范围字母e到i
print(r)
r = re.findall("^[oet]", s) # 开头只有t
print(r)
r = re.findall("[^oet]", s) # 除了oet之外的所有字符
print(r)
7、|选择元字符
# |: 选择元字符
s = "z\nzood\nfood"
r = re.findall("z|food", s) # 匹配z或food
print(r)
r = re.findall("[z|f]ood", s) # 匹配zood或food
print(r)
r = re.findall("[zf]ood", s) # 匹配zood或food
print(r)
8、()分组元字符
# ():分组元字符
s = "z\nzood\nfood"
r = re.findall("[zf]o*", s)
print(r) # ['z', 'zoo', 'foo']
r = re.findall("[zf](o*)", s) # 只要括号内的字符
print(r) # ['', 'oo', 'oo']
9、\转义元字符
# 字符串的转义
s1 = r"z\nzo\nzoo"
print(s1)
# 转义元字符\
s = "123456@qq.com"
r = re.findall("\.", s)
print(r)
二、贪婪和非贪婪
1、非贪婪模式.*?
尽可能少的匹配字符
s = "abcabdadcaec"
r = re.findall("ab.*?c", s)
print(r) # ['abc', 'abdadc']
2、贪婪模式.*/.+
尽可能多的匹配字符
s = "abcabdadcaec"
r = re.findall("ab.*c", s) # .* 或者.+ 都是贪婪模式
print(r) # ['abcabdadcaec']
三、预定义字符组
提前定义好的字符
预定义字符类 | 说明 | 对等字符类 |
---|---|---|
\d | 任一数字字符 | [0-9] |
\D | 任一非数字字符 | [^0-9] |
\s | 任一空白符 | [\t\n\x0B\f\r] |
\S | 任一非空白符 | [^\t\n\x0B\f\r] |
\w | 任一字母数字字符 | [a-zA-Z0-9] |
\W | 任一非字母数字字符 | [^a-zA-Z0-9] |
import re
# \d:[0-9]
s = "<a href='lkjk'>494152494125</a>"
r = re.findall("\d", s)
print(r)
r = re.findall("\d.*\d", s) # 可以取到一起
print(r) # ['494152494125']
# \D:[^0-9]
r = re.findall("\D", s)
print(r)
# \s; \S
s = "apgjap*+-*/ aohgn\tkwpog\najgoj"
r = re.findall("\s", s)
print(r)
r = re.findall("\S", s)
print(r)
# \w 字母数字下划线汉字
s = "apg12312412jap*_+-*/ aohgn\tkw你好pog\najgoj"
r = re.findall("\w", s)
print(r)
r = re.findall("\W", s)
print(r)
实际应用
import re
s = "12345231@qq.com"
a = re.findall("^\w+@\w+\.com$", s)
print(a) # ['12345231@qq.com']
四、常用函数
1、findall
将匹配到的全部内容放入一个列表返回
import re
s = "Cats are Cat"
r1 = re.findall("C\w+", s)
r2 = re.findall("(C\w+)", s)
r3 = re.findall("C(\w+)", s)
r4 = re.findall("(C)(\w+)", s)
print(r1) # ['Cats', 'Cat']
print(r2) # ['Cats', 'Cat']
print(r3) # ['ats', 'at']
print(r4) # [('C', 'ats'), ('C', 'at')]
2、match
从头匹配(如果字符串的开始不符合表达式则匹配失败从头匹配(如果字符串的开始不符合表达式则匹配失败)
import re
s = "Cats are Cat"
r = re.match("C\w+", s) # 只匹配字符串的开头
print(r.group()) # 获取匹配到的值必须要group
r = re.match("(C)(\w+)", s)
print(r.groups()) # 获取匹配到的分组
3、search
会浏览整个字符串但会返回第一个字符串
import re
s = "cats are Cat"
r = re.search("C\w+", s) # 匹配字符串的开头 如果开头没有则匹配后面有的
print(r.group()) # 获取匹配到的值必须要group
r = re.search("(C)(\w+)", s)
print(r.groups()) # 获取匹配到的分组