复习-正则的使用

本文介绍了Python中的正则表达式基础知识,包括元字符如.、w、s等的用法,量词的控制以及贪婪与惰性匹配的概念。同时展示了如何使用re模块的findall、finditer、search和match方法进行匹配操作,并提供了在爬虫中预编译正则表达式的示例。
摘要由CSDN通过智能技术生成
元字符
.       匹配除换行以外的任意字符
\w      匹配字母数字下划线
\W      匹配非字母或数字或下划线
\s      匹配任意空白字符  等价于\n\t\f\r   换行  制表  换页  回车
\S      匹配非空白字符
\d      匹配数字
\D      匹配非数字
\n      匹配换行符
\t      匹配制表符
^       匹配字符串开始
$       匹配字符串结尾
a|b     匹配字符a或字符b
()      匹配括号内的表达式,也表示一个组   使用group(index)可以获取对应结果
[...]   匹配字符组中的字符
[^...]  匹配除了字符组中字符的所有字符

量词:控制前面元字符出现的次数
*       重复至少零次
+       重复至少一次
?       重复零次或一次
{n}     重复n次
{n,}    重复至少n次
{n,m}   重复n到m次

贪婪匹配和惰性匹配
贪婪匹配是结果内容尽可能长的去匹配    惰性匹配是结果内容尽可能短的去匹配
.*      贪婪匹配
.*?     惰性匹配

常见用法:

import re
pattern = r"([\w\.]+@[A-Za-z0-9]+)(\.[A-Za-z0-9]+){1,2}"    #适用于文本中匹配邮箱
a = re.findall(pattern,'dasdsa:adsa@139.com dsa')       #findall  返回所有结果到一个列表
print(type(a),a)                                        #<class 'list'> [('adsa@139', '.com')]   整个正则匹配的结果是adsa@139.com    返回的是两个()内的结果
a = re.finditer(pattern,'dasdsa:adsa@139.com dsa')      #finditer 返回所有结果到一个迭代器,迭代器里面是match对象,用group()查看
print(type(a),list(a)[0].group())                       #<class 'callable_iterator'>    adsa@139.com
a = re.search(pattern,'dasdsa:adsa@139.com dsa')        #search 任意位置开始匹配,匹配到一个结果就停止,有结果返回match对象,没有返回None,查看结果需用group()函数
print(type(a),a)                                        #<class 're.Match'> <re.Match object; span=(7, 19), match='adsa@139.com'>
a = re.match(pattern,'dasdsaadsa@139.com dsa')         #match 只能从头开始匹配,匹配到一个结果就停止,有结果返回match对象,没有返回None,查看结果需用group()函数
print(type(a),'\n'+a.group()+'\n'+a.group(1)+'\n'+a.group(2)+'\n'+a.group(0))
'''  
<class 're.Match'> 
dasdsaadsa@139.com
dasdsaadsa@139
.com
dasdsaadsa@139.com
可以看出group() 等价于 group(0)     group(1)是正则里的第一个()内的内容    group(2)是正则里的第二个()内的内容
'''
'''所以实际应用中,想要在文本中查找所有邮箱可以这样'''
pattern = r"([\w\.]+@[A-Za-z0-9]+(\.[A-Za-z0-9]+){1,2})"    #包含了   a.dsa@qq.com     和   3211s@qq.vip.com   这两种少见的情况
a = re.findall(pattern,'dasdsa:adsa@139.com dsadhaishi \n dgasdsas:dsa@qq.vip.com dsayu')    #这里面有效的邮箱是adsa@139.com和dsa@qq.vip.com
print(a)        #[('adsa@139.com', '.com'), ('dsa@qq.vip.com', '.com')]
# 从这里也可看出()有两种含义:1.写正则的时候,将表达式分组,便于对整组的数量的定义    2.想要专门输出结果的时候,可以给该内容设置()


#预加载正则表达式,可以反复使用此正则
# obj = re.compile(pattern)
# obj.match('要查找的字符串')
#
# #爬虫实际应用
# obj = re.compile(r'''br /><br /> href="(?P<url>.*?)">(?P<name>.*?)<strong>''',re.S)
# for result_iter in obj.finditer('要查找的字符串'):
#     result_dic = result_iter.groupdict()
#     print(result_dic['name'],result_dic['url'])

不使用re.S时,则只在每一行内进行匹配,如果存在一行没有,就换下一行重新开始,使用re.S参数以后,正则表达式会将这个字符串看做整体,在整体中进行匹配,一般在爬虫项目中会经常用到。

  1. re.I 忽略大小写
  2. re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
  3. re.M 多行模式
  4. re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
  5. re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
  6. re.X 为了增加可读性,忽略空格和 # 后面的注释
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值