Python 正则表达式
- \d表示任意一位0~9的数字
例子:\d\d\d-\d\d\d\d-\d\d\d\d 匹配一个电话号码,格式为xxx-xxxx-xxxx
- {n} 大括号里面带数字n表示匹配前面的字符n次
例子:\d\d\d连续一样的匹配表达式可以写成\d{3}\d{4}\d{4}
- Python的所有正则表达式都在re模块中,使用前先导入 import re
- 匹配用法:phoneRegex = re.compile(r’\d{3}-\d{4}-\d{4}’) ; mo = phoneRegex.search(‘my phone num 133-1234-2233’); mo.group() 返回匹配的字符串。注意:如果匹配不上时,会返回这个异常aa 'AttributeError:NoneType' object has no attribute 'group'
小结:使用正则表达式的步骤,1).用import re导入正则表达式模块 2). 用re.compile()函数创建一个Regex对象(r‘user string’, 这种方式表示使用原始字符串,不会对‘\’做转义处理)3). 向Regex对象的search()方法传入想查找的字符串。它返回一个march对象 4). 调用march对象的group()方法,返回实际匹配的文本字符串。
- 分组,用圆括号表示(); 正则表达式第一对括号是第一组,第二对括号是第二组。
例子:phonenum = re.compile(r’(\d{3})-(\d{4}-\d{4})’),mo = phonenum.search(‘133-333-4567’), mo.group(1) 返回字符串‘133’, mo.group(2)返回字符串‘333-4567’,group中不传参数或传入0则返回整个匹配的字符串 mo.group(), mo.group(0) 返回’133-333-4567’
- 如果一次就获得所有分组,使用groups()方法 fstnum, scdnum = mo.groups(),fstnum值是’133’, scdnum值是‘333-4567’
- 管道,‘|’表示, 匹配多个分组;第一次匹配的文本将作为match对象返回
例子:heroRegx = re.compile(r’Batman | Tina Fey’); mo = heroRegx.search(r‘Batman and Tina Fey’) ; mo.group() 返回’Batman’
- 问号,‘?’实现可选匹配;字符?表明它前面的分组在这个模式中是可选的。
例子:batRegex = re.compile(r‘Bat(wo)?man’); mo1 = batRegex.search(‘The Adventures of Batman’) ; mo1.group() 返回’Batman’; mo2 = batRegex.search(‘The Adventures of Batwoman’); mo2.group() 返回’Batwoman’
- 星号,‘*’ 匹配0次或多次;星号之前的分组可以在文本中出现任意多次
- 加号,‘+’ 匹配1次或多次;加号之前的分组至少出现1次
- 花括号,’{}’ 匹配特定次数; 想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括号包围的数字。例子:(Ha){3} 将匹配‘HaHaHa’。 除了一个数字,还可以指定一个范围 (Ha){3,5} 匹配’HaHaHa’,‘HaHaHaHa’,‘HaHaHaHaHa’, 或者(Ha){3,} ;(Ha){,5} 分别匹配3次及以上,0-5次
- 贪心匹配和非贪心匹配;python正则表达式默认是贪心匹配,这表示有二义的情况下,他们会尽可能匹配最长的字符串。花括号问号的非贪心版本匹配尽可能最短的字符串{}?,例子:匹配规则(Ha){3,5} 和(Ha){3,5}?,在同一个字符串’HaHaHaHaHa’中,规则1贪心匹配结果是‘HaHaHa’,规则2非贪心匹配结果是’HaHaHaHaHa’。问号在正则表达式中可能有两种含义:声明非贪心匹配或表示可选的分组,两种含义是完全无关的。
- findall()方法,search()方法只返回第一次匹配的文本,findall()可以返回全部匹配的结果。
- 字符分类:
缩写字符 | 表示 |
\d | 0-9之间的数字 |
\D | 除0-9数字以外的任何字符 |
\w | 字母,数字,下划线字符 |
\W | 除字母,数字,下划线字符的任何字符 |
\s | 空格,制表符或换行符 |
\S | 除空格,制表符或换行符以外的任何字符 |
- 建立自己的字符分类,方括号:有时候用上面的字符分类太宽泛,可以用方括号定义自己的字符分类。 例子[abcde], 字符分类将只匹配其中的a-e. volReg=re.compile(r’[abcde]’) ; mo = voReg.findall(‘Hello world’); print(mo) 将返回列表[‘e’,’d’]
- ’^’ 和 ‘$’;^表明匹配必须发生在被查找文本的开始处。$表明该字符串必须以这个正则表达式的模式结束。可以同时使用^和$。例子^\d+$ 匹配从开始到结束都是数字的字符串
- 通配字符,‘.’ 句点;它匹配除了换行之外的所有字符。句点字符只匹配一个字符
- 匹配换行字符,re.compile()的第二个参数传入re.DOTALL来匹配包括换行字符的所有字符, 例子:newRegex = re.compile(r’.*’, re.DOTALL); newRegex.search(‘Server the pu \n protect’) ; 返回‘Server the pu \n protect’
复习:?匹配0次或1次前面的分组
*匹配0次或多次前面的分组
+匹配1次或多次前面的分组
{n}匹配n次前面的分组
{n,}匹配n次及以上的分组
{,m}匹配0次到m次的分组
{n,m}匹配n到m次的分组
{n,m}?对前面的分组进行非贪心匹配
^spam字符串必须以spam开始
$spam字符串必须以spam结束
.匹配所有单个字符,换行符和空格除外
[abc]匹配方括号内的任意字符
[^abc]匹配不在方括号内的任意字符
- 不区分大小写的匹配,re.compile()第二个参数传入re.IGNORECASE或re.I
- 替换字符串,sub()方法,找到字符串后,想要替换到找到的字符串。例子:nameRegex=re.compile(r’Agent \w+’); nameRegex.sub(‘CENSORED’, ‘Agent Alice gave the’); 返回结果’CENSORED Alice gave the’
- re.VERBOSE, 复杂的正则表达式可以分开多行写,并且加上注释,这时第二个参数需要re.VERBOSE。
- re.I re.DOTALL 和re.VERBOSE组合使用时用‘|’连接
关于异常aa的处理:使用下面格式,异常发生时不会导致程序崩溃
try :
正常的业务处理逻辑
except(AttributeError) :
异常发生时的处理逻辑