常用操作符:
. 表示任何单个字符
[ ] 字符集,对单个字符给出取值范围
[^ ] 非字符集,对单个字符给出排除范围
* 前一个字符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),最小匹配