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,抓取图片内容并保存到本地












0 0
原创粉丝点击