概述
正则表达式
- 英文名为Regular Expression,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
Python正则表达式
- Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python语言拥有全部的正则表达式功能。同时,re 模块是用c语言写的,其匹配速度非常快。
- 其中compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
re模块
re.match方法
re.match 尝试从字符串的起始位置匹配一个规则,匹配成功就返回match对象,否则返回None。可以使用group()获取匹配成功的字符串。
- 语法:
re.match(pattern, string, flags=0)
- 参数说明:
示例1(无标志位):
示例2(有标志位):
- 如果同时使用多个标志位使用|分割,比如re.I | re.M
- flags可选标志位
- 我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
示例:
常用的匹配规则-匹配字符
- .(点):匹配任意除换行符之外的字符
[ ] :匹配中括号内的任意一个字符
- \d :匹配一个数字
- \D 匹配非数字,即不是数字
- \s 匹配空白字符串
- \S 匹配非空白字符
- \W 匹配非单词字符
- \w 匹配单词字符,即a-z、A-Z、0-9、_
常用的匹配规则-匹配字符数量
- *:匹配前一个字符出现0次或者无限次,即可有可无
:使用实例,写一个正则匹配python变量名(变量名的语法规则:不能以数字开头,变量名只能包含字母,数字,下划线)
- ?:使用实例,匹配0-99的数字
- {n,m} :匹配前一个字符出现从n到m次,使用实例,匹配qq邮箱
常用的匹配规则-原生字符串
- python字符串中\作为转义字符开头,比如\n表示换行,\t表示tab键,为了表示\本身,再加一个\,成为\形式在python中表示路径‘G:\py资料\1-上课资料\4-正则表达式课件\html’
- 下面使用正则表达式来匹配路径
- 正则表达式里使用"“作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”",那么使用编程语言表示的正则表达式里将需要4个反斜杠""。
- 在python中有原生字符串,在字符串前面加上r表示字符串中的\不转义。
常用的匹配规则-匹配开头结尾
示例:匹配163.com的邮箱地址
常用的匹配规则- 分组匹配
- |:匹配出0-100之间的数字
- (ab) 分组:分别匹配电号码区号和电话号码
- \ :匹配html中的文本
- 其实我们发现html的标签都是成对出现的,这样匹配规则html就可以引用组来实现,避免重复写。
- 在使用组引用的时候如果有多个组就容易造成混乱,比如下面多个组引用,这样很混乱也不容易阅读
解决上面这个问题得给分组起别名
- (?P)分组起别名
- (?P=name)引用别名为name分组匹配到的字符串
注:(?P)和(?P=name)中的字母P大写
re.compile方法
compile 将正则表达式模式编译成一个正则表达式对象
reg = re.compile(pattern) result = reg.match(string)
- 等效于
result = re.match(pattern, string)
- 使用re.compile()和保存所产生的正则表达式对象重用效率更高
re.search方法
search 在全文中匹配一次,匹配到就返回
- 语法:
re.search(pattern, string, flags=0)
- 函数参数说明:
- 示例:扫描字符串,寻找的第一个由该正则表达式模式产生匹配的位置,并返回相应的MatchObject实例。
re.findall方法
findall 匹配所有返回一个列表,这个方法使用频率较高。
- 语法:
findall(string[, pos[, endpos]])
- 参数说明:
- 示例:使用findall来匹配出段子网中的所有段子
通过观察网页源代码,可以看出段子都包含在(.*?)中
re.sub方法
sub 将匹配到的数据进行替换
- 语法:
sub(pattern, repl, string, count=0, flags=0)
- 参数说明:
- 示例:
re.split方法
split 根据匹配进行切割字符串,并返回一个列表
- 语法:
split(pattern, string, maxsplit=0, flags=0)
- 参数说明:
- 示例:
贪婪模式与非贪婪模式
概述
- Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符,非贪婪则相反,总是尝试匹配尽可能少的字符。
- 在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪.
案例
- 匹配淘女郎模特首页所有图片url链接
网站url:
图片url
<img src="//gtd.alicdn.com/sns_logo/i1/TB124_3NXXXXXasXVXXSutbFXXX.jpg_240x240xz.jpg">
正则表达式应该写成
- ‘<img src="(.*)>’
- 默认贪婪模式
- 使用非贪婪模式