python 的re模块与正则表达式

正则表达式

正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进⾏行匹

配和过滤.

1. 字符组

     字符组很简单⽤用[]括起来. 在[  ]中出现的内容会被匹配, 例如:[abc] 匹配a或b或c

[a-z] 匹配a到z之间的所有字母 [0-9]匹配所有阿拉伯数字,能够样子的写的都是按照ASCII上的编码的顺序写的

 

元字符:常用的元字符

.    匹配除换行符以外的任意字符

\n    匹配一个换行符

\t    匹配一个制表符

 

\s    匹配任意的空白符

\S    匹配非空白符

 

\w    匹配字母或数字或下划线

\W    匹配非字母或数字或下划线

 

\d    匹配数字

\D    匹配非数字

 

\b    匹配一个单词的结尾或开头

 

a|b   匹配字符a或字符b

( )    匹配括号内的表达式,也表示一个组

 

使用量词是可以一次匹配到多个字符

*    重复零次或更多次{0,n}

+    重复一次或更多次{1,n}

?    重复零次或一次{0,1}

{n}    重复n次

{n,}    重复n次或更多次

{n,m}    重复n到m次

 

 在量词中的*, +,{} 都属于贪婪匹配. 就是尽可能多的匹配到结果.

 

例如:我是第一个A,然后我是第二个A

使用贪婪匹配的话是  .*A >>>直接获取的从开头到第二个A的位置

.+也是贪婪匹配

惰性匹配如   .*?A >>>>>获取的是从开头到第一个A的位置

 

分组

匹配15位身份证或18位身份号码eg:

^[1-9]\d{13,16}[0-9x]$

^[1-9]\d{14}(\d{2}[0-9x])?$

^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

 

  Python的RE 模块

search、match、findall、finditer

import re
res = re.search('e','alex and excengpter')#查找关键字,搜索到第一个的时候就返回,没有返回None
# print(type(res))#<class '_sre.SRE_Match'>
# print(res.group())  #e

res1  = re.match('al','alex')#必须是从头开始匹配,搜索到第一个的时候就返回,没有返回None
# print(type(res1))#<class '_sre.SRE_Match'>
# print(res1.group())#al

res2 = re.findall('哈把','我的天啊,哈哈啊哈啊哈哈哈')  #查找所有的匹配的结果并以列表的形式返回,如果没有就返回空列表
res3 = re.findall('哈+','我的天啊,哈哈啊哈啊哈哈哈')
# print(res2)#[]
# print(res3)#['哈哈', '哈', '哈哈哈']
res4 = re.finditer('','我的天啊,哈哈啊哈啊哈哈哈') #与findall 一样,不同的是这个返回的是迭代器
#注意但是这个在迭代出来的时候还是需要使用group()才能显示里面的元素
# print(type(res4))#如果finditer 没有查找到内容的话,返回的是一个空的迭代器
for i in res4:
    print(i.group()) #还是需要使用group 才能显示里面的内容

split的使用

import re
# 案例1 
res5  = re.split('[ab]','ni shi yi ge sba sb ba') #按照a或b 进行切割
print(type(res5))#<class 'list'>
print(res5)#['ni shi yi ge s', '', ' s', ' ', '', '']
res6  = re.split('([ab])','ni shi yi ge sba,sb,ba') #按照a或b 进行切割,并保留a,b
print(type(res6))#<class 'list'>
print(res6)#['ni shi yi ge s', 'b', '', 'a', ',s', 'b', ',', 'b', '', 'a', '']
# 案例2
gg = re.split(r'\d+','我2是3笨4蛋')
print(gg)
hh = re.split(r'(\d+)','我2是3笨4蛋')
print(hh)
View Code

compile 的使用

import re
# 案例1
aa = re.compile(r'fa\d+of')#从正则表达式匹配的内容每个组起名字,定义一个正则表达式的模板,并进行预加载
cc = aa.search('hahd fajofa11111ofa')
print(type(cc))#<class '_sre.SRE_Match'>
print(cc.group())#fa11111of

# 案例2
bb = re.compile(r'fa(?P<gg>\d+)of')   # (?P<gg>)将括号内匹配到的东西进行命名,方便以后直接通过名字进行提取括号的内容
cc = bb.search('hahd fajofa11111ofa')
print(cc.group())#fa11111of
print(cc.group('gg'))#11111
View Code

使用正则进行替换sub、subn

import re
gg  = re.sub(r'\d+','*将前面表达式匹配到的替换成我*','123我是有多么的爱你是笨蛋23333')#返回的是字符窜
print(gg)
dd = re.subn(r'\d+','*将前面表达式匹配到的替换成我*','123我是有多么的爱你是笨蛋23333')#与上面的功能是一样的,
# 但是返回的是元组,(第一个是替换后的字符串,第二个是替换的个数)
View Code

使用re 的制作的简单的爬虫

from urllib.request import urlopen
import re
url = 'https://www.dytt8.net/html/gndy/dyzz/20181116/57793.html'
gg = urlopen(url).read().decode('gbk')
# print(gg)
dd = re.compile(r'<div id="Zoom">.*?译  名(?P<name>.*?)<br />.*?片 '
                r' 名(?P<name1>.*?)<br />.*?年  代(?P<time>.*?)<br />.*?bgcolor=.*?href="(?P<Herf>.*?)">'
,re.S)
# name = dd.search(gg).group('name')
# name2 = dd.search(gg).group('name1')
# name3= dd.search(gg).group('time')
name4= dd.search(gg).group('Herf')
 

 

注意的是:

ret = re.findall('www.(baidu|guge).com', 'www.baidu.com')

print(ret)  # ['baidu]     这是因为findall会优先把匹配结果组内容返回,如果想要匹

配结果,取消权限即可

ret = re.findall('www.(?:baidu| guge).com', ' 'www.baidu.com'')

print(ret)  # [' 'www.baidu.com'']

 

posted @ 2018-11-16 20:57  好大一个圈  阅读(167)  评论(0编辑  收藏  举报