python 正则表达式
python在1.5版本时使用re模块来处理正则表达式,提供perl风格的正则模式。
用处:
a.判断字符串是否满足某个条件---判断输入的字符串是否是邮箱/ 手机号码。是否是ip地址
b.提取满足条件的字符串
c.字符串替换
编译正则表达式,使用re.compile
函数compile(pattern [,flags])
参数pattern,模式字符串,即正则表达式。
可选参数flags,标志位,用来修改正则表达式的匹配方式
返回一个pattern对象
标志位参数:
re.I(re.IGNORECASE) 使匹配对大小写不敏感
re.L(re.LOCAL) 做本地化识别匹配
re.M(re.MULTILINE) 多行匹配,影响^和$
re.S(re.DOTALL) 使匹配包括换行在内的所有字符
re.U(re.UNICODE) 根据Unicode字符集解析字符,影响\w,\W,\b,\B
re.X(re.VERBOSE) 通过给予你更灵活的格式以便你将正则表达式写得更易于理解
如:
string=r'wan\w' html='Citizen wang,always fall in love with neighbour, WANG' pa=re.compile(string,re.I) li=pa.findall(html) print(li)
最后返回一个列表:['wang', 'WANG']
注:\w,表示匹配任意单词字符,和[a-zA-Z0-9_]等价(包括下划线)
re.match()函数
总是从字符串开头匹配,并返回match对象。通过match对象的group()或group(0)获得匹配的结果。
re.match(pattern,string[,flags=0])
如:
>>>ma=re.match('\w','_hello')
>>>ma.group()
最后返回:'-'
若:
>>>ma=re.match('\w','?hello')
>>>ma.group()
最后返回:AttributeError: 'NoneType' object has no attribute 'group'
re.search()函数
对整个字符串进行搜索匹配,返回第一个匹配的match对象。
re.search(pattern,string[,flags=0])
>>>ma=re.match('e\wl','_hello')
>>>ma.group()
最后返回:ell
re.split()
分割字符串
split(pattern, string, maxsplit=0, flags=0)
单一分割符时与str.split(self, /, sep=None, maxsplit=-1)方法一样
re.sub()
sub是substitute,即字符串替换
sub(pattern, repl, string, count=0, flags=0)
如:string='a 111 b 111' 将111替换成222
也可以用str.replace(self, old, new, count=-1, /)
常用元字符:
. 匹配一个任意字符(除换行以外) ,要匹配包括换行[.\n]
\d 匹配一个数字字符,等价[0-9]
\s 匹配一个任意空白字符 ,等价于[\f\n\r\t\v]
\w 匹配一个任意单词字符和下划线,等价于[a-zA-Z0-9_]
\b 匹配一个单词边界,不匹配任何实际字符,看不到。
^ 匹配字符串的开始
$ 匹配字符串的结束
| A|B 表示匹配正则表达式 A 或者 B
重复:
* 重复0次或多次
+ 重复1次或多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或多次
{n,m} 重复n次到m次
反义:
\D \S \W \B [^x]
字符集:[]
匹配一个字符,这字符是字符集中的任意一个字符。
例如:
[abc], [\d+]
[字符1-字符2] --> 匹配一个字符,这个字符是Unicode编码值在字符1到字符2中的任意一个字符;要求字符1的编码值要小于字符2
例如:
[1-9] --> 数字1到9 [a-z] --> 小写字母 [A-Z] --> 大写字母
[\u4E00-\u9fa5] --> 匹配所有的汉字
注意:-在中括号中,如果放在两个字符之间表示范围。
分组:()
懒惰匹配:在重复限定符后面加?号。
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。
例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数
量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
例:a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。