目录
用来匹配字符的一种规则,通过其中的规则选择验证判断及操作符合预期结果的字符,编程语言基本上都适用这套规则,在python中使用正则表达式是只要导入re库即可(python自带re库,不需要额外的安装)
Python官网正则表达式:https://docs.python.org/3/howto/regex.html
pythonRE库:https://docs.python.org/3/library/re.html#re-syntax
正则表达式验证: https://regex101.com/
3:正则表达式;4:可以添加匹配的过滤规则;5:匹配的字符内容
在右边功能栏中有匹配的结果信息。
Python正则表达式RE库
re库常用正则匹配方法
findall() :查找与re匹配的所有子字符串,并将匹配到的对象作为列表返回
finditer() : 查找与re匹配的所有子字符串,并将匹配到的对象作为迭代器返回
match() :从字符串的起始位置匹配,如果匹配成功,则返回一个匹配对象,没有匹配成功时返回一个None值。(只能是匹配起始位置)
search():同match()方法,不同于前者的是匹配字符串任何位置上的第一个对象。
对于使用match()和search()方法返回的对象可以用一些方法得到这个对象匹配信息:
group():返回与re匹配的子字符串
span():返回匹配到的子字符串在源字符串中的索引位置区间(左闭右开)
start():返回匹配到的子字符串在源字符串中的起始索引
end():返回匹配到的子字符串在源字符串中的结束位置(索引+1)
import re
z = 'hello jia @456'
# m1和m2用来验证match()方法只能匹配到起始位置上的子字符串
m1 = re.match(r'el',z)
m2 = re.match(r'hel',z)
print(m1)
print(m2);print(m2.group());print(m2.start())
print(m2.end());print(m2.span())
s = re.search(r'ell',z)
print(s);print(s.group());print(s.span())
print(m2.start());print(s.end())
import re
z = 'hello jia @456'
# findall()匹配所有的子字符串并以列表返回
f = re.findall(r'l',z);print(f)
# findall()匹配所有的子字符串并以迭代器返回
fi = re.finditer(r'l',z)
print(fi);print(next(fi));print(next(fi))
compile创建正则对象
对于一些固定的正则验证可以使用两种方法,一种是直接调用re的匹配函数(将正则表达式以参数传入到函数中更为简洁),函数中的参数为正则表达式和需要匹配字符串;另一种是先创建一个正则匹配对象(使用compile类创建一个正则对象,参数为正则表达式),然后再使用这个对象的方法进行匹配(对compile类对象使用类方法时方法参数只需要传入要进行匹配的字符串)。
import re
# 直接调用re中的方法匹配
email = '265354655@qq.com'
r = r'[\d]+@[\w]+\.com'
m = re.findall(r,email)
print(m)
# 使用compile()方法先创建一个正则表达式对象,后再使用这个类的其他方法进行正则匹配
f = re.compile(r'[\d]+@[\w]+\.com')
m1 = f.findall(email)
m2 = f.match(email)
m3 = f.search(email)
print(m1);print(m2);print(m3)
元字符(metacharacters)
在正则表达式中代表某种类型的字符,在直接匹配时,这些字符不是匹配它本身,而是匹配它所代表的一类对象。要想匹配自身就需要使用转义符 \ ,因为正则中需要经常使用转义符,为了防止特殊字符的转义,在表达式前面一般需要用r。
匹配单字符
用来确定匹配字符的类型
. 表示要匹配除了换行符(\n)之外的任何单个字符。在具体字符后面加点,或前面加点,表示匹配这个字符后一个或前一位前一个字符。
[] 匹配指定字符([]中列举出的字符),^放在[]中表示取非括号里面的集合,具有取反的作用。不带转义符\的元字符在[]中表示字符本身。
\d 匹配0-9数字,相当于[0-9]
\D 匹配非数字符,相当于[^0-9]
\s 匹配任何空白字符,相当于[\t\n\r\f\v]
\S 匹配任何非空白字符,相当于[^ \t\n\r\f\v]
\w 匹配任何字母数字符及下划线_,相当于[a-zA-Z0-9_]或[0-z_]
\W 匹配任何非字母数字字符及下划线_,相当于 [^a-zA-Z0-9_]
修饰元字符
限定匹配字符数量的元字符:用来修饰前一个字符
* 匹配前一个字符出现的次数为0到正无穷,即需要匹配的字符可有可无
+ 匹配前一个字符出现的次数为1到正无穷,即需要匹配的字符至少出现1次
? 匹配前一个字符出现的次数为0或1次
{m} 匹配前一个字符出现的次数为m次
{m,n} 匹配前一个字符出现的次数为m到n次
{m,} 匹配前一个字符出现的次数至少为m次
限定边界的元字符
^ 匹配字符串时对开头字符进行限制,另一种同样作用的匹配/A也是匹配开头
$ 匹配字符串时对结尾字符进行限制,另一种同样作用的匹配/Z也是匹配结尾
\b 匹配一个单词的边界,零宽度的断言,仅在单词开头或结尾匹配。单词被定义为字母数字字符序列,所以单词的结尾由空格或非字母数字字符表示。
\B 匹配非单词边界,零宽度的断言,与的相反\b,只在当前位置不在单词边界时匹配。
a = 'hello python,hellopythonhellopython'
print(re.findall(r'\bhello\b',a))
print(re.findall(r'\Bhello\B',a))
分组匹配
| 匹配|左右任意一个正则表达式(或的关系),注意使用|时,管道符两边不要有空格。
(ab) 将每个括号中的字符作为一个分组拿出存放在元组中,圆括号——分组:正则表达式中表示组选择,每个括号中的内容为一组。组选择可以去掉用来帮助选择的字符。
import re
email = '256984369@qq.com'
r = r'((\w+)((@.+)\.com$))'
em = re.findall(r,email)
print(em)
贪婪模式与非贪婪模式
正则默认都是用贪婪模式匹配数据的,会尽可能多的去匹配符合要求的数据。非贪婪模式下,会匹配最短的符合要求的数据。
如下面的代码,需要将每个<>中的内容取出,使用.*或.+会匹配到最大长度的内容,这是.*和.+的贪婪模式,这时需要使用非贪婪模式,在.*或.+后面加?
import re
html = '<post><not><scr><name>'
print(re.findall(r'<.+>',html))
print(re.findall(r'<.*>',html))
print(re.findall(r'<.+?>',html))
print(re.findall(r'<.*?>',html))
正则编译方式:表达修饰符
re.A或re.ASCII:默认模式,Unicode模式下匹配完整的ASCII,\w,\W,\b,\B,\d,\D,\s和\S 都适用。
re.I或re.IGNORECASE:忽略区分大小写。
re.M或re.MULTILINE:多行模式,不指定时为默认为单行模式,指定后为多行模式。主要结合^ $ \A \Z的使用。
re.S或re.DOTALL:可以匹配换行符,比使用 . 匹配多了换行符。
re.X或re.VERBOSE:用于对正则的解释说明。
这些编译方式在使用时指明参数flags即可。
import re
# 不区分大小写匹配
st = 'pythonPYTHON'
print(re.compile(r'[a-z]',re.I).findall(st))
print(re.findall(r'[a-z]','pythonPYTHON',flags=re.I))
# 添加正则说明
email = '256984369@qq.com'
print(re.compile(r'''
((\w+) # 匹配邮箱中的数字
((@.+) # 匹配邮箱的类型
\.com$) # 匹配.com字符
)''',re.X).findall(email))
其他方法
fullmatch():匹配整个字符串并返回匹配的结果,如果整个字符串符合表达式就输出match的结果对象,否则为None。
h = '1548'
print(re.fullmatch(r'[\d]+',h))
split():通过想匹配的正则表达式来分割字符,split(pattern,string,maxsplit = 0,flags = 0 )
参数:maxsplit表示切割的次数(默认为0),没有这个参数则切取所有符合正则的字符,如果切割字符重复,会切割出空的字符。
print(re.split(r'[a-z]','123a456b789c000d258ef',maxsplit=3))
print(re.split(r'[a-z]','q123a456b789c000d258ef'))
sub():用来替换匹配到的字符,sub(pattern,repl,string,count = 0,flags = 0 )
参数:repl用来替换匹配字符的字符,count指定替换的最大次数(默认为0),如果没有这个参数则默认替换匹配到的所有字符。
print(re.sub(r'[oy]','&','python python',3))
更多用法:https://docs.python.org/3/library/re.html#re-syntax
参考网站:https://www.runoob.com/python3/python3-reg-expressions.html