一、正则表达式
正则表达式(Regular Expressions):一种字符串匹配模式,达到一种类似于模糊查询的效果。
Python中通过调用re库import re
引入正则模块后可进行相关匹配操作。
二、re库常用函数
1、re.search()
与Python自带的字符串函数find()类似,find()在字符串中寻找指定的字符串的位置,并返回该字符串首次出现的首字母的索引。如果字符串未找到,返回-1。
s='hello'
s.find('o')
输出:4
re.search()中如果匹配字符串未找到,无返回值。
re.search(r'h','hello,9mynmaeis')
输出:<re.Match object; span=(0, 1), match=‘h’>
2、re.findall()
在字符串中返回正则表达式所匹配的的所有子串,并返回一个列表。如果一个都没有匹配上,则返回空列表。
#匹配字符串中的所有数字
re.findall('[0-9]',"My name is pan.I'm 30 years old.I have 7 tasks to do.")
输出:
[‘3’, ‘0’, ‘7’]
3、re.match()
与re.search()的区别在于,search()函数匹配整个字符串,而match()函数从字符串的起始位置开始匹配。
re.match(r'9','hello,9mynmaeis')#从起始位置开始匹配,匹配不成功,无返回值
re.search(r'9','hello,9mynmaeis')#匹配整个字符串,匹配成功
输出:<re.Match object; span=(6, 7), match=‘9’>
re.match(r'hello','hello,9mynmaeis')#从起始位置开始匹配,匹配成功
输出:<re.Match object; span=(0, 5), match=‘hello’>
4、finditer()
在字符串中返回正则表达式所匹配的的所有子串,并返回一个re.Match object对象。
iter=re.finditer('[0-9]',"My name is pan.I'm 30 years old.I have 7 tasks to do.")
for i in iter:
print(i)
输出:
<re.Match object; span=(19, 20), match=‘3’>
<re.Match object; span=(20, 21), match=‘0’>
<re.Match object; span=(39, 40), match=‘7’>
5、re.sub()
替换正则表达式所匹配到的所有子串
re.sub(pattern,repl, string, count=0, flags=0)
pattern:必选参数,需要替换掉的值,可以是特定值也可以是正则表达式
repl:必选参数,替换值
string:必选参数,需要执行替换操作的字符串
count:可选参数,替换次数,默认为值为0,替换掉所有符合条件的值
flags:可选参数,编译标志。(这个参数没有去深入了解,目前默认值是够用的)
re.sub('[0-9]','','hello,my name5 is pan8',count=0)
输出:
‘hello,my name is pan’
re.sub('[0-9]','','hello,my name5 is pan8',count=1)
输出:
‘hello,my name is pan8’
6、re.split()
以正则表达式作为分隔符将字符串分割,返回列表
re.split(',','hello,my name is pan')
输出:
[‘hello’, ‘my name is pan’]
三、常用通配符wild-card
1、.:匹配任何字符
2、*:重复一个字符大于等于0次
3、+:重复一个字符大于等于1次
4、^:匹配一行字符的开头
$:匹配一行字符的结尾
re.findall('^X.*','X-man ')
输出:[‘X-man’]
5、\s:匹配空格
6、\S:匹配非空格字符
re.findall('^X-\S+','X-DSPAM-RESULT:Inmocent')#匹配字符串:以X-开头且X-后为非空格
输出:[‘X-DSPAM-RESULT:Inmocent’]
re.findall('^X-\S+','X-Plane is')
输出:[‘X-Plane’]
7、列表
(1)[12]:匹配指定的单个数字
re.findall('[12]','my favorite 2 number is 2 and 19')
输出:[‘2’, ‘2’, ‘1’]
(2)[0-9]:匹配0-9任意单个数字
re.findall('[0-9]','my favorite 2 number is 2 and 19')
输出:[‘2’, ‘2’, ‘1’, ‘9’]
(3)[abc]:匹配指定的单个小写字母
re.findall('[fa]','my favorite 2 number is 2 and 19')
输出:[‘f’, ‘a’, ‘a’]
(4)[MF]:匹配指定的单个大写字母
re.findall('[MF]','My Favorite 2 Number Is 2 And 19')
输出:[‘M’, ‘F’]
(5)[a-z]:匹配任意单个小写字母
[A-Z]:匹配任意单个大写字母
[a-zA-Z]:匹配任意单个大小写字母
[a-zA-Z0-9]:匹配任意单个数字、任意单个大小写字母
s='we just received $5.5'
re.findall('\$[0-9.]+',s)#[0-9.]匹配0-9任意数字及小数点,因为$是系统中已定义的通配符,此处使用转义字符\。
输出:[’$5.5’]
四、正则表达式中括号的使用:只返回括号中正则表达式匹配到的子串
1、没有括号:
#匹配到以From+空格开始的行,并在该行取值邮箱
s='From pan.zhou@163.com'
re.findall('^From \S+@\S+',s)
输出:
[‘From pan.zhou@163.com’]
2、加上括号
加上括号之后,意为只返回括号中正则表达式匹配到的子串
#匹配以From开始的行,并取值邮箱
s='From pan.zhou@163.com'
re.findall('^From (\S+@\S+)',s)
输出:
[‘pan.zhou@163.com’]
五、贪婪匹配与非贪婪匹配
1、贪婪匹配:取最长的匹配子串
s='From:Using the:characters'
re.findall('^F.+:',s)
输出:[‘From:Using the:’]
2、非贪婪匹配:取最短的匹配子串
在正则表达式中使用?,达到非贪婪匹配效果
s='From:Using the:characters'
re.findall('^F.+?:',s)
输出:[‘From:’]