re模块
正则表达式在线测试工具 :http://tool.chinaz.com/regex/
正则表达式规则:
A,字符组:[字符组], 出现在字符组 [ ] 内的所有字符都能匹配上,例如[1,2,3,4,5,a,#] 就能匹配到 1,2,3,4,5,a,# 中的任何一个字符,且一个字符组只能匹配一个字符
可以以范围的形式出现 [0-9] , [a-z] ,[A-Z], 还可以出现多个范围 [a-zA-Z0-9!@#],但是范围必须从小到大,不如[a-Z]不行, [A-z]就可以,但从ASCII码中可以看出[A-z]还包含处字母外的其他 字符
B,元字符:含有特殊意义
\小写字母 代表能够匹配 \大写字符 代表相反的匹配 字符组 [\大小字母\小写字符] 即可匹配所有字符(包括换行符)
| . | 匹配出换行符以外的任意字符 |
| \w | 匹配数字或字母或下划线(word) |
| \s | 匹配任意空白字符(space) |
| \d | 匹配任意数字(digit) |
| \W | 匹配非数字或字母或下划线 |
| \S | 匹配非空白字符 |
| \D | 匹配非数字 |
| \n | 匹配一个换行符(python中的 \n) |
| \t | 匹配一个制表符(TAB键) |
| \b | 匹配一个单词的结尾(x\b:匹配单词中以X结尾的x,xxyyx,则匹配到最后一个x) |
| ^ | 匹配字符串的开头(^abc:只匹配整个字符串开头的abc,其他任何地方包括其他行都匹配不到) |
| $ | 匹配字符串的结尾(abc$:只匹配整个字符串结尾的abc,其他任何地方包括其他行都匹配不到) |
| a|b | 匹配a或者b,返回两个结果(ab|abc:匹配ab或者abc,且优先匹配左边的,如果是abc的字符串,则只匹配ab,不匹配abc) |
| () | 匹配小括号内的表达式,也表示一个组 |
| [...] | 匹配字符组中的字符([1,2,3]匹配1或2或3) |
| [^...] | 匹配除了字符组中字符的所有字符([^1,2,3]:匹配除了1,2,3之外的所有字符) |
C,量词: 所有的量词都需要用正则匹配规则的前面
| * | 匹配0次或多次 |
| + | 匹配1次或多次 |
| ? | 匹配0次或1次 |
| {n} | 匹配n次 |
| {n,} | 匹配n次或者更多次 |
| {n,m} | 匹配n到m次 |
D,分组 () ,或 | ,分组后可重新使用量词 (\d\w)+ ,比如1a2b3c4d,就可以匹配出1a ,2b3c4d
或: 例如需要匹配身份证号码, ^([1-9]\d{16}[0-9x]|[1-9]\d[14])$
E,转义符 \ r"\\d":让整个字符串不转义
F,惰性匹配 : 在量词的后面加?可以使贪婪匹配变成惰性
<script>...<script> <.*> --> <script>...<script>(直接匹配整个)
<.*?> --> <script>,<script> (可匹配出两个<script>)
几个常用的惰性匹配:
*? 匹配任意多次,但是尽可能少重复
+? 匹配一次或多次,但是经可能少重复
?? 匹配一次或多次,但是尽可能少重复
{n,m} 匹配n次到m次,但是尽可能少重复
{n,} 匹配n次以上, 但是尽可能少重复
re模块:
1, re.findall() 返回所有满足匹配条件的结果,放在列表中 例如 re.findall('a','aabcda') --->['a', 'a']
2,re.search() 从前往后找,找到一个就返回,返回的是一个对象,加上group()方法后才是对应的值,没有找到返回None,调用group()就会报错
group()的原理 : 根据正则表达式的分组来选,为空时则取全部
3, re.match() 必须从第一个字符开始匹配,用法和search()一样
4, re.split('b' , 'abcd') 把abcd从b进行切割,得到 'a' 和‘bcd'
5, re.sub('a', '1', 'abcd') 把abcd中的a替换为 1
6 , re.subn() 用法和sub一样,但是subn() 多返回一个替换的次数
7,re.complie() 当某个规则需要多次使用时,可以先把规则进行编译
rex = re.compile('a')
ret = rex.search('abcd') -->'a'
ret2 = rex.match('aqwer') -->'a'
8, re.finditer() 返回一个存放匹配结果的迭代器: <callable_iterator object at 0x0000019A30990D30>
>>> ret = re.finditer('\d', '1ffg2gff3hg5')
>>> print(ret.__next__().group())
1
>>> print(ret.__next__().group())
2
>>> print(ret.__next__().group())
3
>>> print(ret.__next__().group())
5
注意:
1,findall 的优先级查询 在正则表达式中有分组时,会优先匹配分组的内容,如果想要匹配结果,取消权限即可
re.findall('www.(baidu|hello).com','www.baidu.com')
>>>['baidu']
在分组前加上?: 取消优先分组权限
re.findall('www.(?:baidu|hello).com','www.baidu.com')
>>>['www.baidu.com']
2, split 的优先级查询
>>> re.split('\d','abc1def2fgh')
['abc', 'def', 'fgh']
加上分组之后 的结果会保留 匹配项
>>> re.split('(\d)','abc1def2fgh')
['abc', '1', 'def', '2', 'fgh']

浙公网安备 33010602011771号