Python学习笔记——正则表达式入门
# 本文对正则知识不做详细解释,仅作入门级的正则知识目录。
正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致。题外话不多讲,直接上干货:
1. 元字符:
与之对应的还有反义字符,大部分为小写字母变大写,例如\D表示匹配非数字的字符。
2. 重复(即匹配变长的字符串):
元字符可匹配单一的字符类型,若想匹配长度未知或长度限定的字符串需要在后边加上限定符。
3. 范围与分组:
有时元字符并不能满足匹配字符的需求,这时就需要[]来圈定匹配范围,例如要匹配一个只带有a,s,d,f的单词,可以用\b[asdf]\b;正则里面还有小括号用来表示分组,比如你想重复某几个字符,就可以使用分组,例如(\d.\d){1,3}表示匹配小括号里的重复内容一到三次。此外,小括号还可以用来后向引用等,此处不记。
4. 零宽断言:
零宽断言主要用来查找在某些断言(指定内容)之前或之后的内容,例如(?=exp)匹配表达式exp前面出现的内容(不匹配exp),(?<=exp)匹配表达式exp后面出现的内容,还有负向零宽断言等此处不记。
5. 贪婪与懒惰:
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,即贪婪匹配。如表达式a.*b,搜索aabab的话,它会匹配整个字符串aabab。而懒惰匹配会匹配尽可能少的字符串,只需要在限定符后面加一个?,例如a.*?b会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
6. Python的re模块:
python 提供re模块,提供正则的所有功能。下面只记两个方法和一个注意的地方。
6.1 match方法:
match()
方法判断是否匹配,如果匹配成功,返回一个Match
对象,否则返回None
。
1 >>> import re 2 >>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345') 3 <_sre.SRE_Match object at 0x1026e18b8> 4 >>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345') 5 >>>
如果正则表达式中定义了组,就可以在Match
对象上用group()
方法提取出子串来。注意到group(0)
永远是原始字符串,group(1)
、group(2)
……表示第1、2、……个子串。使用groups()方法还可以得到所有子串。
6.2 split方法:
split()方法可切分子串,如下:
1 >>> re.split(r'[\s\,\;]+', 'a,b;; c d') 2 ['a', 'b', 'c', 'd']
6.3 关于转义字符:
python转义字符串也用\表示,所以正则表达式读取时作为字符串出现时会被编译器自动去掉转移字符的\,正则使用时就会出错,所以推荐使用python的 r 前缀。
ps:
本文是对正则表达式的学习总结,大部分知识来源于网上。下面给出两个个人认为比较好的链接:
1.http://www.jb51.net/tools/zhengze.html 对正则表达式介绍的比较详细,个人认为要想深入学习正则表达式还是买本书比较好。
2.http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832260566c26442c671fa489ebc6fe85badda25cd000 来自廖雪峰大神的教程,结合python一起讲,只是稍微短了一点。