正则表达式

正则表达式就是规则表达式,在接触爬虫前,正则表达式就是用来过滤的。接触爬虫后发现真的就是过滤用的hhh。正则表达式在爬虫中的作用就是过滤出想要的字符,然后获取,如果不用正则表达式,那么就会将网页中大量信息全部爬出,造成大量内存浪费,亦不是我们最初想要爬取某些东西的初衷。

正则表达式原理

通过正则表达式我们可以实现

  1. 给定的字符串是否符合正则表达式的过滤逻辑(匹配

  2. 通过正则表达式,从文本字符串中获取我们想要的特定部分(过滤

语法介绍

正则表达式室友普通字符(a-z)以及特殊字符(“元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。

真个则表达式的组件可以是单个字符、字符合集、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式中的字符一般分为普通字符、非打印字符、特殊字符、限定符、定位符等。

普通字符

正常能够被打印的字符

包括没有显示指定为元字符的所有可打印何不可打印字符。这包括所有大写和小写字母,所有数字,所有标点符号和一些其他符号。

正则表达式在线测试:在线正则表达式测试

注意字符串集合和字符串的区别(图一是集合,图二是字符串

非打印字符

非打印字符是打印出来,但实际看不到

\cx匹配由x指明的控制字符,如\cM匹配一个Control-M1或者回车符。X值必须为A-Z或a-z之一。否则c将是一个原意的'c'字符。
\f匹配一个换页符,等价\x0c和\cI。
\n匹配一个换行符,等价\x0d和\cJ。
\r匹配一个回车符,等价\x0d和\cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\v\r\t\v]
\S匹配任何非空白字符。等价于\f\v\r\t\v
\t匹配一个制表符,等价\x09个\cI
\v匹配垂直制表符,等价\x0b和\cK

特殊字符

有特殊含义的字符。如果要匹配这些元素需要在字符前面加转义符,即反斜杠字符[]。

$匹配输入字符串结尾位置(有几行
[]标记一个子表达式的开始和结束位置,子表达式可以获取供后面使用
*匹配前面的子表达式0次或多次
+匹配前面的子表达式1次或多次
.匹配除换行符\n之外的任何单个字符
[标记一个中括号表达式的开始
?匹配前面的子表达式0次或1次,或指明一个非贪婪限定符。
\讲下一个字符标记为或特殊字符、或原意字符、或向后引用、或八进制转义符。
^匹配输入字符串的开始位置、除非在方括号表达式中使用,此时它表示排除该字符的集合
{标记限定符表达式的开始。
|指明两项之间的一个选择

和+的用法要比较来看,+比的要求更加严格 

?用法和Windows中文件搜索的?一样

管道符可以实现同时匹配,可以理解为或

限定符

*匹配前面的子表达式0次或多次。例如,zo能匹配"z"以及"zoo",等价于{0,}
+匹配前面的子表达式1次或多次,例如,'zo+'能匹配"zo"以及"zoo",但不能匹配"z"。+等价于{1,}
匹配前面的子表达式0次或1次.例如"do[es]?"可以匹配"do"或"does"中的do。?等价于{0,1}
{n}n是一个非负整数,匹配确定的n次。例如,'o{2}'不能匹配"BOb"中的o,但能匹配'fooooood'中所有的o。
{n,}n是一个非负整数。至少匹配n次。例如'0{2,}'不能匹配"BOb"中的'o',但能匹配"foooooood"中所有的o。'0{1,}'等价于'0+'。'o{0,}'则等价于"o"
{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且做多匹配m次。例如,"o{1,3}"将匹配"foooooood"中的前三个o。'o{0,1}'等价于'0?'。注意在逗号和两个数之间不能有空格

常用函数

  • re.findall[]                 最常用

  • re.conpile[]

  • re.match[]                最常用

  • re.search[]               最常用

  • re.finditer[]

  • re.sub[]                    最常用

  • re.subn[]

  • re.split[]

re.findall[]函数

语法:re.findall[pattern,string,flags=0]-->list[列表]

列出字符串模式中的u送头匹配项,并作为列表储存在list列表中

与re.search[]不一样的地方:

re.findall返回的是列表

re.search返回的是文本

re.findall返回的是列表,re.search返回文本

re.findall匹配多个值,re.search只要匹配到就返回,只匹配一个值

repile[]函数

语法:repile[pattern,flags=0]--->pattern object

根据包含正则表达式的字符串创建模式对象,可以实现更有效率的匹配!用了repile以后,正则对象会得到保留,这样在需要多次运用这个正则对象的时候效率会有较大的提升

此外,repile[]可以接受可选属性,常用来实现不同的特殊功能和语法变更。

MatchObject(匹配对象)方法

group[]:返回被正则匹配的字符串;

start[]:返回匹配开始的位置;

end[]:返回匹配结束的位置;

span[]:返回一个元组包含匹配(开始,结束)的位置。

re.match[]函数

语法:re.match[pattern,string,flags=0]----->match object or None

在字符串的开始位置匹配正则!如果无匹配,返回None

re.search[]函数

语法:re.search[pattern,string,flags=0]----->match object or None

re.search 函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None

re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失效,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.finditer[]函数

语法:re.finditer[pattern,string,flags=0]----->iterator

列出字符串中模式的所有匹配项,并作为一个迭代器(可以被for循环,可以被next遍历)返回。

re.sub[]函数

语法:re.sub[pattern,repl,string,sount=0,flags=0]--------->string

将字符串中所有pattern的匹配项用repl替换

re.subn[]函数

语法:re.subn[pattern,repl,string,count=0,flags=0]

与sub[]实现相同的替换作用,但是subn[]返回一个元组,其中包含新字符串和替换次数!

re.split[]函数

语法:re.split[pattern,string,maxsplit=0,flags=0]----->list

根据模式的匹配项来分割字符串!

更多推荐

Python爬虫之正则表达式