博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 的re模块与正则表达式
阅读量:6963 次
发布时间:2019-06-27

本文共 3283 字,大约阅读时间需要 10 分钟。

正则表达式

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

配和过滤.

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 reres = re.search('e','alex and excengpter')#查找关键字,搜索到第一个的时候就返回,没有返回None# print(type(res))#
# print(res.group()) #eres1 = re.match('al','alex')#必须是从头开始匹配,搜索到第一个的时候就返回,没有返回None# print(type(res1))#
# print(res1.group())#alres2 = 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))#
print(res5)#['ni shi yi ge s', '', ' s', ' ', '', '']res6 = re.split('([ab])','ni shi yi ge sba,sb,ba') #按照a或b 进行切割,并保留a,bprint(type(res6))#
print(res6)#['ni shi yi ge s', 'b', '', 'a', ',s', 'b', ',', 'b', '', 'a', '']# 案例2gg = re.split(r'\d+','我2是3笨4蛋')print(gg)hh = re.split(r'(\d+)','我2是3笨4蛋')print(hh)
View Code

compile 的使用

import re# 案例1aa = re.compile(r'fa\d+of')#从正则表达式匹配的内容每个组起名字,定义一个正则表达式的模板,并进行预加载cc = aa.search('hahd fajofa11111ofa')print(type(cc))#
print(cc.group())#fa11111of# 案例2bb = re.compile(r'fa(?P
\d+)of') # (?P
)将括号内匹配到的东西进行命名,方便以后直接通过名字进行提取括号的内容cc = bb.search('hahd fajofa11111ofa')print(cc.group())#fa11111ofprint(cc.group('gg'))#11111
View Code

使用正则进行替换sub、subn

import regg  = 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'
.*?译  名(?P
.*?)
.*?片 '                 r' 名(?P
.*?)
.*?年  代(?P
 

 

注意的是:

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'']

 

转载于:https://www.cnblogs.com/vivi0403/p/9971573.html

你可能感兴趣的文章
ActiveMQ —— <一> 概述
查看>>
SylixOS内核打印调试方法.
查看>>
加号+和减号-
查看>>
详解Mysql分布式事务XA(跨数据库事务)
查看>>
移动端概述和hybird模式、响应式布局
查看>>
2018年,成功的创业公司网站是怎么设计的?
查看>>
MySQL数据库开发规范
查看>>
安装elasticsearch
查看>>
MySQL 创始人:写代码比打游戏还爽,程序员应该多泡开源社区
查看>>
构造器内部的多态方法的行为
查看>>
Android Studio库Module引用aar文件
查看>>
008-tar,gzip,bzip2的使用
查看>>
静态单元格
查看>>
浅谈 MySQL 集群高可用架构
查看>>
两个路径与四个centos7命令
查看>>
学习之初
查看>>
Linux启动顺序
查看>>
java nio的一点整理(一)
查看>>
Android的三种解析方式
查看>>
Git回退到旧版本
查看>>