Python正则表达式
来源:互联网 发布:淘宝中老年女冬装上衣 编辑:程序博客网 时间:2024/05/23 02:03
(一)正则表达式介绍
课程主要内容:
1,正则表达式基本概念
2,python正则表达式re模块
3,正则表达式语法
为什么使用正则?
当字符串简单的时候,可以使用正则去匹配:
实例1:找到imooc开头的语句
def find_start_imooc(fname):
f=open(fname)
for line in f:
if line.startswitn('imooc'):
print(line)
find_start_imooc('1.txt')
实例2:找到以imooc开头和结尾的语句
def find_in_imooc(fname):
f=open(fname)
for line in f:
if line.startswitn('imooc')\ #使用\进行换行操作 and line[:-1].endswith('imooc'): #进行切片操作,将最后一行的的'\n'默认存在,去掉。
print(line)
find_start_imooc('1.txt')
实例3:匹配一个下划线和字母开头的变量
In [1]: a='_value'
In [2]: a and (a[0]=='_' or 'a'<= a[0] <='z')每次匹配都要单独完成,可以做一个规则
正则表达式概念
1,使用单个字符串来描述匹配一系列符合某个句法规则的字符串
2,是对字符串操作的一种逻辑公式
3,应用场景:处理文本和数据
4,正则表达式过程:依次拿出表达式和文本中的字符比较,如果每个字符串都能匹配,则匹配成功;否则匹配失败。
(二)正则表达式re模块
想要使用正则表达式,需要导入re模块
1,import re :python正则表达式模块
2,第一个正则表达式
r'imooc'→Pattern→Match→result
首先使用re模块的compile函数生成Pattern对象
然后再调用Pattern对象的一个方法去匹配字符串
然后返回Match实例,就是结果
import repal=re.compile(r'_')mal=pal.match('_value')mal.group()
当我们想忽略大小写的时候re.compile(r'imooc',re.I) #表达式后面添加re.I
In [6]: import re
In [7]: pa=re.compile(r'imooc')
In [8]: pa
Out[8]: re.compile(r'imooc', re.UNICODE)
In [9]: type(pa)
Out[9]: _sre.SRE_Pattern
In [10]: help(pa.match)
In [11]: strl
Out[11]: 'imooc nnn'
In [12]: pa.match(strl)
Out[12]: <_sre.SRE_Match object; span=(0, 5), match='imooc'>
In [13]: ma=pa.match(strl)
In [14]: ma
Out[14]: <_sre.SRE_Match object; span=(0, 5), match='imooc'>
In [15]: ma.group()
Out[15]: 'imooc'
In [16]: ma.span() #匹配字符串在源字符串中的位置
Out[16]: (0, 5)
In [17]: ma.string()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-17-3be7b390b54c> in <module>()
----> 1 ma.string()
TypeError: 'str' object is not callable
In [18]: ma.string()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-18-3be7b390b54c> in <module>()
----> 1 ma.string()
TypeError: 'str' object is not callable
In [19]: ma.re
Out[19]: re.compile(r'imooc', re.UNICODE)
In [20]: ma.string
Out[20]: 'imooc nnn'
匹配以'_'开头的字符串
import re
pal=re.compile(r'_')
mal=pal.match('_value')
mal.group()
当我们想忽略大小写的时候
re.compile(r'imooc',re.I) #表达式后面添加re.I
也可以直接使用re.match()
In [1]: str='imooc python'
In [2]: import re
In [3]: ma=re.match(r'imooc',str)
In [4]: ma
Out[4]: <_sre.SRE_Match object; span=(0, 5), match='imooc'>
In [5]: ma.group()
Out[5]: 'imooc'
(二)python正则表达式语法
单个字符串的匹配:
字符 匹配
. 匹配任意字符(除了\n)
[...] 匹配字符集
\d / \D 匹配数字/非数字
\s / \S 匹配空白/非空白字符
\w / \W 匹配单词字符[a-zA-Z0-9]/非单词字符
当我们匹配[]中的字符集时,就要使用转义
ma=re.match(r'\[[\w]\]','[a]')
多个字符串的匹配:
字符 匹配
* 匹配前一个字符0次或者无限次
+ 匹配前一个字符1次或者无限次
? 匹配前一个字符0次或者1次
{m} / {m,n} 匹配前一个字符m次或者n次
*? /+? /?? 匹配模式变为非贪婪(尽可能少匹配字符)
栗子1:ma=re.match(r'[A-Z][a-z]*','Anvfijkvmldfk') #匹配大写字母开始的字符串
栗子2:ma=re.match(r'[_a-zA-Z]+[_\w]*','_htmlkd') #匹配变量名
栗子3:ma=re.match(r'[1-9]?[0-9]','98'] #匹配0-99数字,当我们匹配09的时候,是能够匹配到0的
栗子4:ma=re.match(r'[a-zA-Z0-9]{6}@163.com','abc123@163.com'} #匹配前一个163邮箱
ma=re.match(r'[a-zA-Z0-9]{6,10}@163.com','acvfedem3@163.com'} #匹配不定长的163邮箱
栗子5:贪婪模式 ma=re.match(r'[0-9][a-z]*','1fvjnd') #此时会全匹配
非贪婪模式 ma=re.match(r'[0-9][a-z]*?','1fjnvk')#此时仅仅会匹配到 1
边界匹配
字符 匹配
^ 匹配字符串开头
$ 匹配字符串结尾
\A / \Z 指定额度字符串必须出现在开头/结尾
栗子:ma=re.match(r'\Aimooc[\w]*','imoocpython')
分组匹配
字符 匹配
| 匹配左右任意一个表达式
(ab) 括号中表达式作为一个分组
\<number> 引用编号为num的分组匹配到的字符串
(?P<name>) 分组起一个别名
(?P=name) 引用别名为name的分组匹配字符串
栗子1:ma=re.match(r'[1-9]?\d$|100','100')#匹配左右两侧任意一个字符串
栗子2:ma=re.match(r'[\w]{4,6}@(163|139).com','imooc@139.com')#能够匹配括号中的字符串
栗子3:ma=re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>') #使用别名引用
(三)re模块相关方法使用
re模块中的其他方法:
寻找:
1,search(pattern,string,flags=0)
在一个字符串中查找匹配,只查找第一个匹配的字符串
2,findall(pattern,string,flags=0)
找到匹配,返回所有匹配部分的列表
区别:search寻找到的是单一的,优先匹配到的
findall是将所有能够匹配到的生成一个list返回
In [11]: str2='c++=100,java=90,python=80'
In [12]: info=re.search(r'\d+',str2)
In [13]: info
Out[13]: <_sre.SRE_Match object; span=(4, 7), match='100'>
In [14]: info.group()
Out[14]: '100'
In [15]: info=re.findall(r'\d+',str2)
In [16]: info
Out[16]: ['100', '90', '80']
In [17]: sum([int(x) for x in info]) #列表解析
Out[17]: 270
替换:
3,sub(pattern,repl,string,count=0,flags=0)
将字符串中匹配正则表达式的部分替换为其他值string表示被repl替换或者函数返回的字符串
4,split(pattern,string,maxsplit=0,flags=0)
根据匹配分割字符串,返回分割字符串组成的列表
栗子1:
In [18]: str3='imooc videonum=100'
In [19]: info=re.sub(r'\d+','1000',str3)
In [20]: info
Out[20]: 'imooc videonum=1000'
返回替换后的新的字符串
当repl是函数的话,sub函数的第一步就是根据样式查找匹配,查找匹配后返回的是match对象,然后match对象传入函数repl中
def add1(match):
val=match.group()
num=int(val)+1
return str(num)
re.sub(r'\d+',add1,str1)
栗子2:
In [26]: str4='imooc:c c++ java python'
In [27]: re.split(r':| ',str4)
Out[27]: ['imooc', 'c', 'c++', 'java', 'python']
pattern为指定样式
第一个爬虫:
抓取网页中的图片
1,抓取网页
2,获取图片地址
3,抓取图片内容并保存到本地
- python正则表达式学习
- c++正则表达式,python
- Python正则表达式(一)
- python的正则表达式
- Python正则表达式
- Python初学-正则表达式
- 正则表达式与python
- python正则表达式学习
- python正则表达式学习
- python正则表达式学习
- python正则表达式
- Python - 正则表达式
- Python正则表达式
- python正则表达式
- Python正则表达式指南
- Python正则表达式指南
- Python 正则表达式指南
- python 正则表达式
- android 6.0 内部SD卡权限管理的方法
- STM32 FSMC总线深入研究
- 浏览器兼容性问题(WEB项目中页面)
- 2017校招互联网公司薪资大全 网上以及群里收集的信息,非个人意见
- 面向对象2
- Python正则表达式
- jsonArray遍历 取出数组中对象
- details和summary标签
- 11-12
- 有关homebrew
- Error opening registry key
- 矩阵求导解最小二乘
- semaphore与mutexes的区别
- 多态(动态绑定)