Python学习(九) —— 正则表达式与re模块

时间:2020-12-30 22:22:46

一、正则表达式

  定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

  正则表达式是匹配字符串内容的一种规则。在线测试工具: http://tool.chinaz.com/regex/

  字符组:[],一个字符组匹配一个字符,[0-9],[A-Z],[a-z],[0-9A-Za-z]

Python学习(九) —— 正则表达式与re模块

量词
用法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

  贪婪匹配:在满足匹配条件时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配,加上?,将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

  几个常用的非贪婪匹配:

    *?:重复任意次,但尽可能少重复

    +?:重复1次或更多次,但尽可能少重复

    ??:重复0次或1次,但尽可能少重复

    {n,m}?:重复n到m次,但尽可能少重复

    {n,}?:重复n次以上,但尽可能少重复

    .*?x:取前面任意长度的字符,直到一个x出现

  转义符:在正则表达式中,有很多有特殊意义的是元字符,例如\d和\s等,如果要在正则中匹配正常的‘\d’,则需要对'\'进行转义,变成'\\'。

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
^(\d{17}[\dx])|\d{15}
^\d{15}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
正则表达式匹配身份证号

 

2、re模块

  导入:import re

  re.findall():按照正则表达式找到所有符合的内容,返回列表

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.findall('a','alex egon barry')
print(ret) #'a','a'
View Code

  re.finditer():按照正则表达式找到所有符合的内容,返回迭代器,通过调用group()方法得到匹配的字符串

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.finditer('\d','a1b2c3def')
for i in ret:
print(i.group())
#1
#
2
#
3
View Code

  re.search():按照正则表达式找到一个合适的就返回,没有返回None,通过调用group()方法得到匹配的字符串

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.search('[a-z]','32jfdsajg')
print(ret.group()) #j
View Code

  re.match():按照正则表达式从开始进行匹配,匹配到一个返回,没有返回None,通过调用group()方法得到匹配的字符串

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.match('[a-z]{3}','how are you')
print(ret.group()) #how
View Code

  re.sub(旧,新,字符串,次数):按照正则表达式进行替换,返回替换后的字符串,默认全部替换

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.sub('k','abc','like a kitty',1)
print(ret) #liabce a kitty
View Code

   re.subn(旧,新,字符串):按照正则表达式进行替换,返回元组(替换后的字符串,替换次数)

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.subn('k','8','like a kitty key')
print(ret) #('li8e a 8itty 8ey', 3)
View Code

  re.split():按照正则表达式进行切割,返回一个列表

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.split('a','aalpha')
print(ret) #['','','lph','']
View Code

  re.complie():编译,将正则表达式进行编译,提高运行效率

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
obj
= re.compile('\d{3}')
ret
= obj.search('ab12cd345def')
print(ret.group()) #345
View Code

   注意:

  1.findall的优先级查询:如果正则里面有括号,会优先匹配括号的内容并返回,如果想要匹配全部,用?:取消权限

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
= re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']
View Code

  2.split的优先级查询:如果正则里面有括号,会保留被切割的项,如果正则没有括号,不会保留被切割的项

Python学习(九) —— 正则表达式与re模块Python学习(九) —— 正则表达式与re模块
import re
ret
=re.split("\d+","eva3egon4yuan")
print(ret) #['eva', 'egon', 'yuan']
ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #['eva', '3', 'egon', '4', 'yuan']

#没有()的没有保留所匹配的项,有()的保留了匹配的项,
#
这个在某些需要保留匹配部分的使用过程是非常重要的
View Code

 

  匹配标签

import re
ret
= re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#
获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name')) #h1
print(ret.group()) #<h1>hello</h1>

ret
= re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
#
获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1)) #h1
print(ret.group()) #<h1>hello</h1>

 

  匹配整数

import re
content
= '1 - 2 * ( (60-30 +(-40/5.0) * (9-3.33 + 198/4*2998 +10 * 568/14 )))'
ret
= re.findall(r'\d+\.\d+|(\d+)',content)
print(ret)
ret.remove(
'')
print(ret)
#['1', '2', '60', '30', '40', '', '9', '', '198', '4', '2998', '10', '568', '14']
#
['1', '2', '60', '30', '40', '9', '', '198', '4', '2998', '10', '568', '14']

 

  flags

re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变
^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释