元字符
. 匹配除换行以外的任意字符
\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参数以后,正则表达式会将这个字符串看做整体,在整体中进行匹配,一般在爬虫项目中会经常用到。
- re.I 忽略大小写
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M 多行模式
- re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释