正则表达式是一种匹配输入文本的模式。Net框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成正则表达式的本质还是一个字符串。作用就是在一个很大的文本内搜索某一个字段。
使用步骤
- 首先导入re库
- 建立函数
result= re.findall("表达式",text)
- 表达式建立
- 返回result
元字符介绍
正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串
元字符作用表:
来源:IT-wanghanghang的博客
元字符 | 描述 |
---|---|
@符号 | 正则表达式字符串前面加上@字符,这样不让编译器去解析其中的转义字符 |
*符号 | *代表0-多个字符 |
\符号 | \是转义字符. 是元字符,如果要表示一个\ . 字符的话,需要使用\ . * |
| | 将两个匹配条件进行逻辑“或”(Or)运算。 |
( ) | 用小括号来指定子表达式(也叫做分组) |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母、数字、下划线、汉字(指大小写字母、0-9的数字、下划线_) |
\W | \w的补集(除“大小写字母、0-9的数字、下划线_”之外) |
\s | 匹配任意空白符 (包括换行符/n、回车符/r、制表符/t、垂直制表符/v、换页符/f) |
\S | \s的补集 (除\s定义的字符之外) |
\d | 匹配数字(0-9数字) |
\D | 表示\d的补集(除0-9数字之外) |
[ab] | 匹配中括号中的字符 |
[a-c] | a字符到c字符之间是字符 |
[ ^ x] | 匹配除了x以外的任意字符 |
[ ^adwz] | 匹配除了adwz这几个字符以外的任意字符 |
{n} | 匹配前面的字符n次 |
{n,} | 匹配前面的字符n次或多于n次 |
{n,m} | 匹配前面的字符n到m次 |
? | 重复零次或一次 |
+ | 重复一次或更多次 |
* | 重复零次或更多次 |
爬虫中re使用
在进行爬虫中正则表达式非常常用,下面我们就来看一下re在爬虫中的使用
首先来看一下匹配的示例:
f = '''
I love you
You love me
He love me
'''
for line
Pattern 对象提供的一些常用方法:
- findall 方法:全部匹配,返回列表
- search 方法:从任何位置开始查找,一次匹配
- match 方法:从起始位置开始查找,一次匹配
- finditer 方法:全部匹配,返回迭代器
- split 方法:分割字符串,返回列表
- sub 方法:替换
findall方法
findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])
#string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置
match 方法
match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])
'''match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果
参数string表示字符串;pos表示下标,pos和endpos的默认值分别为0和len(string);参数flags用于编译pattern时指定匹配模式。
match方法是从字符串的pos下标处起开始匹配pattern,如果pattern结束时已经匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None
'''
当匹配成功时返回一个 Match 对象,其中:
- group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()
- start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
- end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
- span([group]) 方法返回 (start(group), end(group))。
search 方法
re.search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])
'''参数string表示字符串;pos表示下标,pos和endpos的默认值分别为0和len(string));参数flags用于编译pattern时指定匹配模式
search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
举个例子:
'''
finditer 方法
finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。
split 方法
split(string[, maxsplit])
'''
split 方法按照能够匹配的子串将字符串分割后返回列表,其中,maxsplit 用于指定最大分割次数,不指定将全部分割。
'''
sub 方法
sub(repl, string[, count])
- sub 方法用于替换,其中,repl 可以是字符串也可以是一个函数:
- 如果 repl 是字符串,则会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl 还可以使用 id 的形式来引用分组,但不能使用编号 0;
- 如果 repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
- count 用于指定最多替换次数,不指定时全部替换
实战讲解
1.获取标签之间内容
该部分主要是通过正则表达式获取两个标签之间的内容,通常这种标签都是成对出现的。
开始标签如:、、、、
…
后缀标签如:
后缀标签如:
核心代码:
res_tr = r’(.*?)’
m_tr = re.findall(res_tr,language,re.S|re.M)
样例:
import re
language = '''<tr><th> name:</th><td> year:</td></tr><tr>'''
#正则表达式获取<tr></tr>之间内容
res_tr = r'<tr>(.*?)</tr>'
m_tr = re.findall(res_tr,language,re.S|re.M)