正则表达式

来源:互联网 发布:学而知之什么意思 编辑:程序博客网 时间:2024/06/18 15:26

 常用操作符:

.  表示任何单个字符

[ ] 字符集,对单个字符给出取值范围

[^ ] 非字符集,对单个字符给出排除范围

* 前一个字符0次或者无限次扩展

+ 前一个字符1次或者无限次扩展

? 前一个字符0次或者一次扩展

 |  左右表达式任意一个

{m} 扩展前一个字符m次 

{m,n} 扩展前一个字符m至n次(含n)     eg: PY{:3}N  = PN,PYN,PYYN,PYYYN

^ 匹配字符串开头     ^abc 

$ 匹配字符串结尾     abc$

( ) 分组标记,内部只能使用 | 操作符

\d 数字等价于[0-9]

\w 单词字符等价于[A-Za-z0-9_]


实例:

由26个字母组成的字符串:^[A-Za-z]+$

由26个字母和数字组成的字符串 : ^[A-Za-z0-9]+$

整数形式的字符串:^-?\d+$

正整数形式的字符串:^[0-9]*[1-9][0-9]*$

中国境内邮政编码:[1-9]\d{5}

匹配中文字符:[\u4e00-\u9fa5]    utf编码中中文字符的取值范围

国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}

ip地址:(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])


re库的基本使用:

属于python的标准库,import re
表示方法为:r'[1-9]\d{5}'

re.search(pattern,string,flags=0)在字符串中搜索匹配正则表达式的第一个位置,返回match对象,查看方法match.group(0)
flags:
re.I(re.IGNORECASE)忽略大小写
re.M(re.MULTILINE)正则表达式中的^操作符能将给定字符串的每行当作匹配开始
re.S(re.DOTALL).能匹配所有的字符,而默认是匹配除了换行符之外的所有

re.match 是从一个字符串的开始位置起匹配正则表达式,返回一个match对象
re.findall搜索字符串,以列表类型返回全部能匹配的子串
re.split(pattern,string,maxsplit,flags)  maxsplit为最大分割数
返回值为一个列表
re.finditer,返回一个匹配结果的迭代类型,每个迭代元素是match对象
eg:
match = re.finditer(r'[1-9]\d{5}','123456and098765')for m in match:print(m.group(0))
re.sub(pattern,repl,string,count,flags)在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串,repl表示替换匹配字符串的字符串,count为最大替换次数

re库的两种使用方法:

1、rst = re.search(r'[1-9\d{5}','ZZU 450001')
函数式用法,一次性操作
2、pat = re.compile(r'[1-9]\d{5}')
      rst = pat.search('ZZU 450001')
面向对象用法:一次编译后多次使用
regex = re.compile(pattern,flags)将正则表达式的字符串形式编译为正则表达式对象

Match对象:

属性:
.string 待匹配的文本
.re 匹配时使用的pattern对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置

方法:
.group(0)获得匹配后的字符串
.start()\end()匹配字符串在原始字符串的开始\结束位置
.span()返回(.start(),.end())

贪婪算法:

同时匹配长短不同的多项,Re库默认采用贪婪匹配,即输出匹配最长的子串
而如果想要最小匹配,则需要对以下几个操作符做出改变:
*?   前一个字符串0次或无限次扩展 ,最小匹配
+?    前一个字符串1次或无限次扩展 ,最小匹配 
??前一个字符串0次或1次扩展 ,最小匹配
{m,n}?扩展前一个字符m至n次(含n),最小匹配