Python爬虫学习笔记.正则表达式

正则表达式

  • 一,正则表达式介绍
    • Ⅰ,一般字符
    • Ⅱ,预定义字符集
    • Ⅲ,数量词
    • Ⅳ,边界匹配
  • 二,re库的介绍
    • 1,match()方法
    • 2,search()方法
    • 3,findall()方法
    • 5,sub()方法
    • 6,compile()方法

一,正则表达式介绍

概述:正则表达式是有自己特定语法结构的处理字符串的工具。

Ⅰ,一般字符

字符 含义
. 匹配任意单个字符(不包括换行符\n)
\ 转义字符
[…] (对应字符集中任意字符)
|

.:匹配任意单个字符,如a.c可以匹配的结果为abc,avc等。
\:转义字符,如\n
[…]:在括号中任选一个,如a[bcd],匹配的结果为ab,ac,ad。
|:a|b匹配a或b

Ⅱ,预定义字符集

预定义字符集 含义
\d 匹配一个数字字符。等价于[0-9]
\D 匹配一个非数字字符。等价于[^0-9]
\s 匹配任何空白字符,包括空格,制表符,换页符等。等价于[\f\n\r\t\v]
\S 匹配任何非空白字符,等价于[^\f\n\r\t\v]
\w 匹配字母,数字以及下划线。
\W 匹配不是字母、数字以及下划线的字符。

\f:换页符
\r:回车符(与\n有区别)
\v:垂直制表

Ⅲ,数量词

数量词 含义
* 匹配前一个字符0或无限次
+ 匹配前一个字符1或无限次
匹配前一个字符0或1次
{m} 匹配前一个字符m次
{m,n} 匹配前一个字符m至n次

*:如abc匹配ac,abc,abbc等
+:如ab
c匹配abc,abbc,abbbc等
?:ab?c匹配ac,abc
{m}:如ab{3}c匹配abbbc
{m,n}:如ab{2,4}匹配abbc,abbbc和abbbbc

Ⅳ,边界匹配

边界匹配 含义
^ 匹配字符串开头
$ 匹配字符串结尾
\A 匹配字符串开头
\Z 匹配字符串结尾,若存在换行,仅匹配到换行前的字符串

二,re库的介绍

利用此库,可以在Python中使用正则表达式

1,match()方法

①基本用法
语法:re.match(pattern, string, flags=0)
作用:尝试从字符串起始位置匹配正则表达式
参数:
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,接收标志修饰符
返回值:若匹配成功,返回结果;若失败,返回None。

示例:

import re

string = 'Hello fly 123 4567 World_Cup is a Range Refuge '
re_string = 'Hello\s\D{3}\s\d{3}\s\d{4}\s\w{9}'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group())#方法group(),输出匹配到的内容
print(result.span())#方法span(),输出匹配的范围

②匹配目标
用()将像提取的子字符串括起来,以标记一个子字符串的起始位置和结束位置,被标记的子字符串会依次对应每一个分组,向group()传递索引可以获取想要的结果。

import re

string = 'Hello fly 123 4567 World_Cup is a Range Refuge '
re_string = 'Hello\s(\D{3})\s\d{3}\s(\d{4})\s\w{9}'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group(1))
print(result.group(2))

③通用匹配
万能匹配组合:.*
目的:简化正则表达式的书写

import re

string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*Range'
result = re.match(string=string,pattern=re_string)
print(result)

④贪婪与非贪婪
贪婪匹配:
一般情况下,.*会尽可能多的匹配字符。

import re

string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*(\d+).*Range'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group(1))

非贪婪匹配:
写法:.*?
尽可能少的匹配字符。

import re

string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*?(\d+\s\d+).*Range'
result = re.match(string=string,pattern=re_string)
print(result)
print(result.group(1))

注意:/(.*)放在结尾,可能无法匹配任何内容

import re

string = 'Hello fly 123 4567 World_Cup is a Range Refuge'
re_string = '^Hello.*?\d+\s\d+.*Range\s(.*?)'
result = re.match(string=string,pattern=re_string)
print(result.group(1))
re_string = '^Hello.*?\d+\s\d+.*Range\s(.*)'
result = re.match(string=string,pattern=re_string)
print(result.group(1))

⑤修饰符

修饰符 描述
re.I 是匹配对大小写不敏感
re.S 使.匹配包括\n在内的所有字符

反例:

import re

string = 'Hello fly 123 4567 World_Cup is '\
         '\na Range Refuge'
re_string = '^Hello.*?\d+\s\d+(.*)Range\s'
result = re.match(string=string,pattern=re_string)
print(result.group())

此时,抛出错误提示

正确做法:

import re

string = 'Hello fly 123 4567 World_Cup is '\
         '\na Range Refuge'
re_string = '^Hello.*?\d+\s\d+(.*)Range\s'
result = re.match(string=string,pattern=re_string,flags=re.S)
print(result.group())

⑥转义匹配
当遇到用于正则匹配模式的特殊字符时,前加\即可

2,search()方法

match()更适合用于检测某个字符串是否符合某个正则表达式的规则。
search()在匹配时会扫描整个字符串。
返回值:返回第一个匹配的结果,若遍历完了还未找到,就返回None。

引例:

import re

string = 'Hello fly 123 4567 World_Cup is '\
         'a Range Refuge'
re_string = '\d{4}'
result = re.search(string=string,pattern=re_string)
print(result.group())

实例:
尝试从该段html文档中提取class为active的li节点内部的超链接所包含的歌手名和歌名。

import re

html='''

经典老歌

经典老歌列表

'''
re_string = '(.*?)' result = re.search(string=html,pattern=re_string,flags=re.S) print(result.group(1),result.group(2))

3,findall()方法

功能:获取匹配正则表达式的所有内容
返回值:匹配正则表达式的所有内容,列表类型

import re

html='''

经典老歌

经典老歌列表

'''
re_string = '(.*?)' results = re.findall(string=html,pattern=re_string,flags=re.S) print(results)

5,sub()方法

借用正则表达式来修改文本。

函数原型:sub(pattern, repl, string, count=0, flags=0)
pattern:正则中的模式字符串
repl:要替换的字符串(匹配pattern后将其替换为repl),可以是个函数
string:要修改的字符串
count:修改的最大次数
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,接收标志修饰符

返回值:返回修改后的字符串

引例:

import re

content = 'sadada112132adsf231asda'
re_string = '\d+'
result = re.sub(pattern=re_string,repl='',string=content)
print(result)

实例:
目的:获取所有li节点的歌名
思路:先修改html文件,再用findall()获取

import re

html='''

经典老歌

经典老歌列表

'''
re_string = '|' modified_html = re.sub(pattern=re_string,string=html,repl='') re_string = '(.*?)' result = re.findall(pattern=re_string,string=html,flags=re.S) print(result)

6,compile()方法

可将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。
函数原型:compile(pattern, flags=0)
返回:匹配的对象,如:与findall()一起使用,返回一个列表
单独使用毫无意义,常常和search(),findall(),match()一起使用

例子:

import re

content1 = 'Hello,I am Lily.'
content2 = 'Hello,I am Lucy.'
re_string = '\s.*?\.'
pattern = re.compile(pattern=re_string)
result1 = re.sub(pattern=pattern,string=content1,repl='')
result2 = re.sub(pattern=pattern,string=content2,repl='')
print(result1)
print(result2)

你可能感兴趣的:(Python爬虫学习笔记,python,爬虫)