爬虫解析 之(十) --- Re模块
正则表达式
正则表达式其实就是特殊的字符串, 帮助进行检索, 校验, 查询等行为,是对字符串操作的一种逻辑公式,
事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符”,这个“规则字符” 来表达对字符的一种过滤逻辑。
Python提供的正则表达式机制: 需要导入模块 re
正则表达式使用场景
验证的作用: 密码的验证 用户名的验证 邮箱 手机号等等
爬虫: 查询校验
正则表达式的规则
正则表达式处理字符串的强大工具, 拥有自己独特的语法, 并且拥有一个独立处理正则表达式的引擎.
正则表达式处理字符串的效率要比系统本身提供的低, 如果系统的能够完成, 就不用正则表达式
替换 ---- 将字符串中b小写字母 替换成B --- 系统的能完成直接使用系统的即可
替换 ---- 将第一个替换成B 第二个替换成 m --- 系统不能完成 使用正则表达式
在re模块下常用的方法
1. re.compile(正则表达式的语法)
根据正则表达式语法生成对应正则表达式对象,方便复用该正则表达式
2. 正则表达式对象.match(要进行验证的字符串)
如果正则表达式语法中没有限制头尾, 验证字符串是否以正则表达式对应字符串开头
如果限制了头尾, 也就是限制了字符串的长度, 验证的字符串内容是否满足正则表达式的需求
如果满足 返回的match对象 不满足返回的是None
3. 正则表达式对象.search(待查找的字符串)
在待查找的字符串中 查找是否有正则表达式对应的字符串内容 如果有获取查找到的第一个内容 以及索引区间 找到的话返回的Match对象 找不到返回None
4. 正则表达式对象.findall(待查找的字符串)
在待查找的字符串中 查找是否有正则表达式对应的字符串内容 将所有满足需求的字符串内容存放于列表
5. 正则表达式对象.sub(正则表达式,替换成的字符串,原字符串)
在待查找的字符串中 替换字符串中每一个匹配的子串后返回替换后的字符串
正则规则
1 \w 匹配字母数字及下划线 2 \W 匹配非字母数字下划线 3 \s 匹配任意空白字符,等价于[\t\n\r\f] 4 \S 匹配任意非空字符 5 \d 匹配任意数字 6 \D 匹配任意非数字 7 \A 匹配字符串开始 8 \Z 匹配字符串结束,如果存在换行,只匹配换行前的结束字符串 9 \z 匹配字符串结束 10 \G 匹配最后匹配完成的位置 11 \n 匹配一个换行符 12 \t 匹配一个制表符 13 ^ 匹配字符串的开头 14 $ 匹配字符串的末尾 15 . 匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 16 [....] 用来表示一组字符,单独列出:[amk]匹配a,m或k 17 [^...] 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符 18 * 匹配0个或多个的表达式 19 + 匹配1个或者多个的表达式 20 ? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 21 {n} 精确匹配n前面的表示 22 {m,m} 匹配n到m次由前面的正则表达式定义片段,贪婪模式 23 a|b 匹配a或者b 24 () 匹配括号内的表达式,也表示一个组
re.match()
re.match(pattern,string,flags=0)
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配的话,match()就会返回None
import re content= "hello 123 4567 World_This is a regex Demo" result = re.match('^hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$',content) result = re.match("^hello.*Demo$",content) # 泛匹配,写法比上面简单 result = re.match('^hello\s(\d+)\sWorld.*Demo$',content) # 匹配字符串中具体的目标,用()括起来 print(result) print(result.group()) # 获取匹配的结果 print(result.span()) # 获去匹配字符串的长度范围
1 import re 2 3 string = '''If you have great talents, industry will improve them; 4 if you have but moderate abilities, 5 industry will supply their deficiency.''' 6 7 # 1)元字符 8 # 普通字符、字母、下划线、数字等ascii码字符 9 pat = r'a' 10 # 非打印字符 11 pat = r'\n' 12 ret = re.findall(pattern=pat,string=string) 13 14 # 2)通配符 15 # y用某些特殊的字符,来表示一类字符串 16 ''' 17 \w 任意的字母、数字、下划线 18 \W 任意的非字母、数字下划线 19 \d 任意的数字 20 \D 21 \s 空白 22 \S 23 [abc] 匹配a、b或c 24 [a-fA-P1-5] 匹配a-f或A-P或者1-5中的任意一个 25 [^abc] 任意一个非abc的字符串 26 ''' 27 pat = r'[^abc]' 28 pat = r'[^a-f]' 29 pat = r'\w' 30 ret = re.findall(pattern=pat,string=string) 31 print(ret) 32 # 特殊字符 33 ''' 34 . 任意的可见字符 35 ^ 从字符串的开头匹配 36 $ 字符串以后什么为结尾 37 + 重复一到多次 38 * 重复0到多次 39 ? 重复0或者1次 40 {m} 重复每次 {,m}至多重复m次 {m,} {m,n} 41 ''' 42 pat = r'^If.+\n.+\n.+' 43 # pat = r'^If.+$' 44 ret = re.findall(pattern=pat,string=string) 45 print(ret) 46 47 # 3) 模式修正 48 # 如果要进模式修正需要用complile将正则表达式创建成一个正则对象 49 # re.S 把多行字符串看成一行 50 # re.M 把多行字符串拆成多个单行来处理 51 # re.I 忽略大小写 52 pat = re.compile(r'^If.+',re.S) 53 ret = pat.findall(string) 54 print(ret) 55 56 # 4) 贪婪模式和懒惰模式 57 string = "afadfasadfafapyasdfadsfapyafadpypyafasdfapyasfasdfdaspyafafdaspyrtyui" 58 pat = re.compile(r".*py") # 贪婪模式:按照规则进行寻找一直找到最后一个符合规则字符串为止 59 pat = re.compile(r".*?py") # 懒惰模式:按照规则进行寻找只要找到符合规则的字符串就立即停止 60 ret = pat.findall(string) 61 print(ret)