爬虫-正则表达式的基础操作

目录: (正则表达式内容)

  • 原子

  • 元字符

  • 模式修正符

  • 贪婪模式和懒惰模式

  • 正则表达式函数

  • 正则实例

  • 原子
    原子是正则表达式中最基础的组成单位,每个正则表达式中至少包含一个原子,常见的类型有:

1、 普通字符作为原子

code1:

import re  //正则表达式
string ="taoyun"
pat="yun"
rst=re.search(pat,string)  #string中查找pat的内容
print(rst)

out:

<re.Match object; span=(6, 7), match='yun'>

2、 非打印换行符作为原子 \n \t

code2:

import re  //正则表达式
string =‘’‘taoyun
‘‘’
pat="\n"
rst=re.search(pat,string)  #string中查找pat的内容
print(rst)
#pat可为“\n”,”\t”

3、 通用字符作为原子:
\w匹配人一个字母、数字、下划线
\W匹配除字母、数字、下划线
\d十进制数字
\D除十进制数字
\s空白字符
\S除空白字符

code3:

string ="taoyudsghj5346676asddf"
pat="\w\d\d\d"  #查找符号此格式的字符
rst=re.search(pat,string)
print(rst)

out:

<re.Match object; span=(9, 13), match='j534'> # pat="\w\d\d\d"

4、 原子表(匹配[]内的任意一个)

code4:

string ="taoyud sghj5346676asddf"
pat="tao[xyz]ud"   
pat="tao[^xaz]ud"  #^非:除了xaz都可匹配
rst=re.search(pat,string)
print(rst)

out:

<re.Match object; span=(0, 6), match='taoyud'>
<re.Match object; span=(0, 6), match='taoyud'>
  • 元字符

所谓的元字符,就是正则表达式中具有特殊含义的字符
1、. 除换行外任意一个字符
2、^ 开始位置
3、$ 结束位置
4、* 0\1\多次
5、? 0\1次
6、+ 1\多次
7、{n} 恰好n次
8、{n,} 至少n次
9、{n,m} 至少n,至多m次
10、| 模式选择符或
11、() 模式单元

code ‘^’:

string ='''taoyudsghj5346676asddf'''
pat="^ao..." #’a’在起始位置才能匹配
rst=re.search(pat,string)
print(rst)

out:

None

code ‘^’:

string ='''taoyudsghj5346676asddf'''
pat="^tao..."
rst=re.search(pat,string)
print(rst)

out:

<re.Match object; span=(0, 6), match='taoyud'>

code ‘’:

string ='''taoyudsghj5346676asddf'''
pat="tao*"
rst=re.search(pat,string) #匹配0\1\多次
print(rst)

out:

<re.Match object; span=(0, 6), match='tao'> 

**code ‘.’:

string ='''taoyudsghj5346676asddf'''
pat="tao.*"
rst=re.search(pat,string) #匹配0\1\多次,因为’.’可代表任意字符,且重复出现了多次
print(rst)

out:

<re.Match object; span=(0, 22), match='taoyudsghj5346676asddf'>

code’+’:

string ='''taooooyudsghj5346676asddf'''
pat="tao+"  #o为重复出现的,所以匹配多次的o
rst=re.search(pat,string)
print(rst)

out:

<re.Match object; span=(0, 6), match='taoooo'>
  • 模式修正符

即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能

1、 I 匹配时忽略大小写*
2、 M 多行匹配*
3、 L 本地化识别匹配
4、 U unicode
5、 S 让’.’匹配包括换行符*

code ‘I’:

string ='''python'''
pat="Python"
rst=re.search(pat,string,re.I)
print(rst)

out:

<re.Match object; span=(0, 6), match='python'>
  • 贪婪模式与懒惰模式

从code即可直观的感受到模式的区别,贪婪为找到p.*y后继续找能到能匹配的字符,懒惰为匹配到p.*y后即完成工作,结果比较精准
#默认为贪婪模式
code:

string ="poythony"
pat1="p.*y"
pat2="p.*?y"#贪婪模式
rst1=re.search(pat1,string)
rst2=re.search(pat2,string)
print(rst)

out:

<re.Match object; span=(0, 8), match='poythony'>
<re.Match object; span=(0, 3), match='poy'>
  • 正则表达式函数

1、 re.match

与search的区别为只能从头开始匹配

string ="poythony"
pat="o.*?y"
rst=re.match(pat,string)
print(rst)

out:

None

2、 re.search(前面已讲)
3、 compile全局匹配函数:只要有满足格式的都匹配

code:

string ="poytptyhopqyny"
pat="p.*?y"
rst=re.compile(pat).findall(string)
print(rst)

out:

['poy', 'pty', 'pqy']
  • 正则实例

任务1:匹配.com和.cn地址

从“<a href=‘http://www.baidu.com’> 百度首页 ’”匹配出协议、主机、域名

code:

import re
string = "<a href=‘http://www.baidu.com’> 百度首页 </a>’"
pat = "[a-zA-Z]+://[^\s]*[.com|.cn]"
rst=re.compile(pat).findall(string)
print(rst)

out:

['http://www.baidu.com']

分析:
(1)匹配为a-z或A-Z的多个字符(+:1\多次)
(2)主机名一定为非空(^\s),匹配多次
(3)或符号匹配.com和.cn

任务2:匹配电话号码

string = "asfaf021-265465456gdfsgfdgg0773-4564654212fsdfhjksd"
pat = "\d{3}-\d{8}|\d{4}-\d{7}"
rst=re.compile(pat).findall(string)
print(rst)

out:

['021-26546545', '0773-4564654']

猜你喜欢

转载自blog.csdn.net/qq_38016957/article/details/88797328