python正则
2015-06-05 16:16
357 查看
正则表达式RE为高级文本搜索模式匹配、搜索-替代等功能提供了基础,它是一种由字符和特殊符号组成的字符串,描述了这些字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串或字符串的集合。python正则表达式的相关模块为re模块。
常用正则表达式符号和特殊字符——
literal:匹配字符串的值,即literal本身
re1|re2:匹配正则表达式re1或re2,可以理解为逻辑或
.:匹配任何单个字符,换行符除外(python有方法取消这个限制的)
^:匹配字符串的开始
$:匹配字符串的结尾
*:匹配前面出现的正则表达式零次或多次
+:匹配前面出现的正则表达式一次或多次
?:匹配前面出现的正则表达式零次或一次
{N}:匹配前面出现的正则表达式N次
{M,N}:匹配重复出现M次到N次的正则表达式
[…]:匹配字符组里出现的任意一个字符
[…x-y…]:匹配从字符x到y中的任意一个字符
[^…]:不匹配此字符集中出现的任意一个字符,包括某一范围的字符
(*|+|?|{})?:用于上面出现的任何“非贪婪”版本,问号有两种含义,单独使用时表示匹配出现零次或一次的情况,紧跟在表示重复的元字符后面时,表示要求搜索引擎匹配的字符串越短越好,留下尽可能多的字符给后面的模式
(…):匹配封闭括号中正则表达式,并保存为子组。圆括号可以对正则表达式进行分组或匹配子组。
\d:匹配任何数字,和[0-9]一样,\D是\d的反义
\w:匹配任何数字或字母字符,和[A-Za-z0-9]一样,\W是\w的反义
\s:匹配任何空白符,和[\n\t\r\v\f]一样,\S是\s的反义
\b:匹配单词边界,\B是\b的反义
\nn:匹配已保存的字组
\c:逐一匹配特殊字符c,即转义字符,有时候\字符太多了容易令人困惑,可用python原始字符串,即在字符串的一开始加r字符。
\A:匹配字符串的开始,\Z匹配字符串的结束
下面介绍python正则表达式(re模块)常见的函数与方法——
compile(pattern,flags=0):对正则表达式pattern进行编译,flags是可选标志符,并返回一个regex对象。由于预编译代码对象比字符串快,正则表达式又经常被用到,这时就用到了这个函数。
match(pattern,string,flags=0):尝试用正则表达式模式pattern匹配字符串string,是从字符串的开头开始匹配的,flags是可选标志符,如果匹配成功,则返回一个匹配对象,否则返回None。
search(pattern,string,flags=0):在字符串string中查找正则表达式模式pattern的第一次出现,flags是可选标志符,如果匹配成功,则返回一个匹配对象,否则返回None。
findall(pattern,string[,flags]):在字符串string中查找正则表达式模式pattern的所有非重复出现,返回一个匹配对象的列表。
finditer(pattern,string[,flags]):和findall()相同,但返回的不是列表而是迭代器,对于每个匹配,该迭代器返回一个匹配对象。
split(pattern,string,max=0):根据正则表达式pattern中分隔符吧字符string分割为一个列表,返回成功匹配的列表,最多分割max次,默认是分割所有匹配的地方。
sub(pattern,rep1,string,max=0):把字符串string中所有匹配正则表达式pattern的地方换成字符串rep1,如果max的值没有给出,则对所有匹配的地方进行替换,另外还有一个类似的subn()。
group(num=0):返回全部匹配对象,或指定编号是num的子组。
groups():返回一个包含全部匹配的子组的元组,如果没有成功匹配,就返回一个空元组。
下面以一个例子展示search与match、贪婪与非贪婪模式的区别——
待匹配的字符串str为:
我们匹配str最后的数字段,即“88888888-6-9”。
匹配模式patt为:
下面是search的结果(符合预期):
再来看一下match(失败了,因为match从字符串开始匹配,匹配失败返回None):
修改匹配模式为patt2(结果不对):
再次修改匹配模式为patt3(分组,结果接近预期了,这是因为匹配模式是贪婪的):
最后修改匹配模式为patt4(成功了,使用了非贪婪模式):
常用正则表达式符号和特殊字符——
literal:匹配字符串的值,即literal本身
re1|re2:匹配正则表达式re1或re2,可以理解为逻辑或
.:匹配任何单个字符,换行符除外(python有方法取消这个限制的)
^:匹配字符串的开始
$:匹配字符串的结尾
*:匹配前面出现的正则表达式零次或多次
+:匹配前面出现的正则表达式一次或多次
?:匹配前面出现的正则表达式零次或一次
{N}:匹配前面出现的正则表达式N次
{M,N}:匹配重复出现M次到N次的正则表达式
[…]:匹配字符组里出现的任意一个字符
[…x-y…]:匹配从字符x到y中的任意一个字符
[^…]:不匹配此字符集中出现的任意一个字符,包括某一范围的字符
(*|+|?|{})?:用于上面出现的任何“非贪婪”版本,问号有两种含义,单独使用时表示匹配出现零次或一次的情况,紧跟在表示重复的元字符后面时,表示要求搜索引擎匹配的字符串越短越好,留下尽可能多的字符给后面的模式
(…):匹配封闭括号中正则表达式,并保存为子组。圆括号可以对正则表达式进行分组或匹配子组。
\d:匹配任何数字,和[0-9]一样,\D是\d的反义
\w:匹配任何数字或字母字符,和[A-Za-z0-9]一样,\W是\w的反义
\s:匹配任何空白符,和[\n\t\r\v\f]一样,\S是\s的反义
\b:匹配单词边界,\B是\b的反义
\nn:匹配已保存的字组
\c:逐一匹配特殊字符c,即转义字符,有时候\字符太多了容易令人困惑,可用python原始字符串,即在字符串的一开始加r字符。
\A:匹配字符串的开始,\Z匹配字符串的结束
下面介绍python正则表达式(re模块)常见的函数与方法——
compile(pattern,flags=0):对正则表达式pattern进行编译,flags是可选标志符,并返回一个regex对象。由于预编译代码对象比字符串快,正则表达式又经常被用到,这时就用到了这个函数。
match(pattern,string,flags=0):尝试用正则表达式模式pattern匹配字符串string,是从字符串的开头开始匹配的,flags是可选标志符,如果匹配成功,则返回一个匹配对象,否则返回None。
search(pattern,string,flags=0):在字符串string中查找正则表达式模式pattern的第一次出现,flags是可选标志符,如果匹配成功,则返回一个匹配对象,否则返回None。
findall(pattern,string[,flags]):在字符串string中查找正则表达式模式pattern的所有非重复出现,返回一个匹配对象的列表。
finditer(pattern,string[,flags]):和findall()相同,但返回的不是列表而是迭代器,对于每个匹配,该迭代器返回一个匹配对象。
split(pattern,string,max=0):根据正则表达式pattern中分隔符吧字符string分割为一个列表,返回成功匹配的列表,最多分割max次,默认是分割所有匹配的地方。
sub(pattern,rep1,string,max=0):把字符串string中所有匹配正则表达式pattern的地方换成字符串rep1,如果max的值没有给出,则对所有匹配的地方进行替换,另外还有一个类似的subn()。
group(num=0):返回全部匹配对象,或指定编号是num的子组。
groups():返回一个包含全部匹配的子组的元组,如果没有成功匹配,就返回一个空元组。
下面以一个例子展示search与match、贪婪与非贪婪模式的区别——
待匹配的字符串str为:
>>> str = 'Fri Jun,5 16:00:00 2015::aidearone@gmail.com::88888888-6-9'
我们匹配str最后的数字段,即“88888888-6-9”。
匹配模式patt为:
>>> patt = '\d+-\d+-\d+'
下面是search的结果(符合预期):
>>> re.search(patt, str).group() '88888888-6-9'
再来看一下match(失败了,因为match从字符串开始匹配,匹配失败返回None):
>>> re.match(patt, str).group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group'
修改匹配模式为patt2(结果不对):
>>> patt2 = '.+\d+-\d+-\d+' >>> re.match(patt2, str).group() 'Fri Jun,5 16:00:00 2015::aidearone@gmail.com::88888888-6-9'
再次修改匹配模式为patt3(分组,结果接近预期了,这是因为匹配模式是贪婪的):
>>> patt3 = '.+(\d+-\d+-\d+)' >>> re.match(patt3, str).group(1) '8-6-9'
最后修改匹配模式为patt4(成功了,使用了非贪婪模式):
>>> patt4 = '.+?(\d+-\d+-\d+)' >>> re.match(patt4, str).group(1) '88888888-6-9'
相关文章推荐
- Python 常用函数time.strftime()简介
- python扫描端口脚本
- Python.h:No such file or directory
- Python之学习笔记(模拟键盘)
- 菜鸟利用python处理大文本数据的血泪路
- [Python]Unicode转ascii码的一个好方法
- python学习――函数式编程
- python解决接口测试获取手机验证码问题
- python K-means工具包初解
- python 自动重启服务
- python模块pygal,出图工具
- 从底层理解Python的执行
- python 对象
- python标准库 - socket
- python 导表---xls笔记
- Python基础:16面向对象概述
- 使用Python绘制热图的库
- PyQt5+python3+pycharm开发环境配置
- Python查看模块信息
- python学习――模块和模块的常用方法