Python学习笔记:正则表达式

并非所有的字符串处理都能用正则表达式

使用正则表达式先导入re模块

import re

*模块级函数: *

找到符合r的字串,返回列表

re.findall(r,str)

找到符合r的字串,返回迭代器对象

re.finditer(r,str)  

判断字符串的开头是否符合匹配,若符合,返回一个match对象,反之无返回值

re.match(r,str)  

判断字符串是否符合匹配,若符合,返回一个match对象,反之无返回值

re.search(r,str) 

判断字符串是否符合匹配,并且进行替换,返回替换结果

re.sub(r'[abc]','o','lalala')#返回值为'lololo' 

判断字符串是否符合匹配,并且进行替换,返回替换结果和替换次数

re.subn(r'[abc]','o','lalala')#返回值为'lololo'   

根据正则表达式分割字符串

re.split(r'[\+\-\*]','123-456+789*000')#返回值为['123', '456', '789', '000']

字符匹配

  1. 普通字符

    re.findall(r'hello','hello world')

  2. 元字符

1.字符集[ ]#可识别出hella helle helli helli hello hellu ##字符集内若加元字符,需要加\

re.findall(r'hell[aeiou]','hello world') 

2.行首搜索 #加在行首##若在字符集[]内,则表示出了后跟的字符以外的字符

re.findall(r'^h','hello world')

3.行尾搜索$ #加在行尾

re.findall(r'ld$','hello world')

4.字符 \

4.1 加在元字符前表示转义#可匹配出该元字符

re.findall(r'\$','123$')

4.2 特殊用法 #预定义字符集

4.2.1数字0-9:[0-9]

\d  

4.2.2数字0-9:[0-9]

\D  

4.2.3空白字符:[ \t\r\n\f\v]

\s 

4.2.4非空白字符:[^ \t\r\n\f\v]

\S 

4.2.5单词字符:[0-9a-zA-Z]

\w   

4.2.6非单词字符:[^0-9a-zA-Z]

\W 

5 重复字符{},*,+,? #均针对前一个字符

5.1{m[,n]}

re.findall(r'\d{11}',tel)#重复查询数字11次,匹配11位电话号码 

re.findall(r'\d{8,11}',tel)#重复查询数字8-11次,匹配8位到11位电话号码 

5.2*

re.findall(r'\d*',tel)#重复查询数字0到20亿次 

5.3+

re.findall(r'\d+',tel)#重复查询数字1到20亿次  

5.4? #若为+? 或*?则表示开启非贪婪模式##贪婪模式表示最大匹配,非贪婪模式表示最小匹配

re.findall(r'\d?',tel)#重复查询数字0或1次 

正则的编译

编译后运行是为了提高匹配速度

r=r'hello'  
r_c=re.compile(r) 
r_c.findall('hello world') 

若想匹配的时候无视大小写,可在编译正则表达式的时候加入re.I

r=r'hello'  
r_c=re.compile(r,re.I)  
r_c.findall('HeLLo world') 

match object实例用法

返回被re匹配的字符串group()

x=re.match(r'a{4}','aaaaaaaa') 

x.group() #返回值为‘aaaa’

返回匹配开始的位置start()

x.start()#返回值为0 

返回匹配结束的位置end()

x.end()#返回值为4 

返回一个元组,其中包含了匹配开始和结束位置span()

x.span()#返回值为(0,4) 

在实际应用中

将match object保存在一个变量中,检查其是否为None

if x:    
    print('The match found')
else:   
    print('None match')

编译标志#统一加在re,findall('r_p','string',re.S/I/L/M/X)

使得.可以匹配包括换行符在内的字符

re.S  

使得正则对大小写不敏感

re.I  

做本地化识别匹配#不太懂

re.L  

使得匹配的时候,待匹配字符串的换行符被无视

re.M 

使得匹配的时候,正则表达式的换行符被无视

re.X 

分组

用()分组后,如下代码:

re.findall('\w*@\w*\.(com|cn|org)','[email protected]')#返回值为()内的com

若加(),正则表达式'\w@\w.(com|cn|org)'表示”若干个单词字符@若干个单词字符.可能是(com)也可能是(cn)也可能是(org)“

若不加(),正则表达式'\w@\w.com|cn|org'表示”可能是(若干个单词字符@若干个单词字符.com)也可能是(c)n也可能是(org)“

分组后,findall优先返回分组内部分的匹配。

你可能感兴趣的:(python,正则表达式,爬虫,python学习,待续)