正则表达式的基础语法:
通过正则表达式可以定义一些匹配规则,只要满足匹配规则即认为匹配成功,从而实现模糊匹配。
正则表达式中既可以包含普通字符,也可以包含由特殊字符指定的匹配模式。
在实际应用正则表达式进行匹配时,正则表达式中的普通字符需要做精确匹配,而特殊字符指定的匹配模式则对应了用于模糊匹配的规则。
由于Python的字符串中使用“\”作为转义符,如果要在字符串中使
用字符“\”,则需要写作“\\”。
因此,当进行“\bfoo\b”的匹配时,实际编写代码时要写作'\\bfoo\\b',但这
样会造成代码编写时容易出错且代码可读性较差。
因此,我们通常在用于表示正则表达式的字符串前加上一个字符r,使得后面的字符串
忽略转义符。例如,对于字符串'\\bfoo\\b',我们可以写作r'\bfoo\b'。
re模块使用-compile和match:
compile:
compile 函数用于将一个字符串形式的正则表达式编译成一个正则表达式对象,
供 match、search以及其他一些函数使用。compile函数的语法格式为:re.compile(pattern, flags=0)
其中,pattern是一个字符串形式的正则表达式;flags指定了匹配选项,可以使用按位或(|)运算符将多个选项连接起来;flags的默认值为0,
表示没有任何匹配选项。
match:
re模块中的match函数用于对字符串开头的若干字符进行正则表达式的匹配。
re.match函数的语法格式为:re.match(pattern, string, flags=0)
其中,pattern是要匹配的正则表达式;string要作正则表达式匹配的字符串;flags参数的含义与compile函数中的flags参数相同。如果匹配成功,则返回一个Match对象;如果匹配失败,则返回None。
import re
result1=re.match(r'python', 'Python是一门流行的编程语言', re.I)
result2=re.match(r'python', '我喜欢学习Python', re.I)
print('result1:',result1)
print('result2:',result2)
out:
result1: <re.Match object; span=(0, 6), match='Python'>
result2: None
match函数返回的是一个Match对象,其中span是匹配的字符序列在字符串中的位置信息,而match中保存了匹配到的字符序列信息。
即便对flags参数指定了匹配选项re.MULTILINE或re.M,re.match函数也只会对字符串开头的若干字符作匹配,而不对后面行的开头字符作匹配。
除了直接调用re模块中的match函数外,也可以使用compile函数生成的正则表达式对象中的match方法实现同样的功能,其语法格式为:Pattern.match(string[,pos[,endpos]])
其中,Pattern是compile函数返回的正则表达式对象;string是要做正则表达式匹配的字符串;可选参数pos指定了从string的哪个位置开始进行匹配,默认为0;可选参数endpos指定了string的结束位置,match函数将对string中pos至endpos-1范围的子串进行正则表达式匹配。
import re
pattern=re.compile(r'python', re.I) #生成正则表达式对象
result1=pattern.match('Python是一门流行的编程语言')
result2=pattern.match('我喜欢学习Python!',5)
print('result1:',result1)
print('result2:',result2)
out:
result1: <re.Match object; span=(0, 6), match='Python'>
result2: <re.Match object; span=(5, 11), match='Python'>
使用compile函数的优点在于:当一个正则表达式在程序中被多次使用时,通过compile函数生成的正则表达式对象可重复使用、从而提高效率。
re模块使用-search:
re模块中的search函数对整个字符串进行扫描并返回第一个匹配的结果。
re.search函数的语法格式为:re.search(pattern, string, flags=0)
re.search函数各参数的含义与re.match函数完全相同。如果匹配成功,
则返回一个Match对象;否则,返回None。
import re
a=re.search("\\d{3}",'h6468kh325guiih')
print(a)
<re.Match object; span=(1, 4), match='646'>
不同于re.match函数(只匹配字符串开头的若干字符),re.search函数可以对整个字符串从左向右扫描找到第一个匹配的字符序列。
使用前面介绍的match函数和search函数,匹配成功时都会返回一个Match对象,
匹配失败时则返回None。将Match对象作为判断条件时,其永远返回True;而None则返回
False。因此,通过“if result1:”和“if result2:”即可判断前面的匹
配是否成功。
if re.search('[0-5]{3}','6iop5426'):
print(re.search('[0-5]{3}','6iop5426'))
out:
<re.Match object; span=(4, 7), match='542'>
if re.search('\\[0-5]{4}','6iop7899'):
print(re.search('\\[0-5]{4}','6iop5426'))
re模块使用-findall和finditer:
re模块中的findall函数用于在字符串中找到所有与正则表达式匹配的子串。re.findall函数的语法格式为:re.findall(pattern,string,flags=0)
各参数含义与re.match和re.search函数完全相同。如果匹配成功,则将匹配的数据以列表的形式返回;如果匹配失败,则返回空列表。
import re
a=re.findall("\\d{3}",'h6468kh325guiih')
print(a)
out:
['646', '325']
与re.match和re.search函数不同,re.findall函数可以一次完成字符串中所有满足正则表达式规则的子串的匹配。
re模块使用-split、sub、subn:
split:
re模块中的split函数用于将字符串按与正则表达式匹配的子串分割。
re.split函数的语法格式如下:re.split(pattern, string, maxsplit=0, flags=0)
其中,pattern是正则表达式;string是要分割的字符串;maxsplit是最大分割次数,默认为0表示不限制分割次数;flags与re.match等函数中
的flags参数含义相同。
import re
str='sno:1810101,name:李晓明,age:19,major:计算机'
re.findall(r'\W+', str)
Out[95]: [':', ',', ':', ',', ':', ',', ':']
rlt=re.split(r'\W+', str)
print(rlt)
out:
['sno', '1810101', 'name', '李晓明', 'age', '19', 'major', '计算机']
sub:
re模块的sub函数用于替换字符串中与正则表达式匹配的子串。re.sub
函数的语法格式为:re.sub(pattern, repl, string, count=0, flags=0)
其中,pattern是正则表达式;repl是要将匹配子串替换成的字符串;string是待做替换操作的字符串;count是最大替换次数,默认为0表示不限制替换次数(即将所有符合正则表达式的子串都替换成repl);flags与re.match等函数中的flags参数含义相同。
import re
str='sno:1810101,name:李晓明,age:19,major:计算机'
re.sub('\\W+','+',str)
Out[14]: 'sno+1810101+name+李晓明+age+19+major+计算机'
subn:
re模块中的subn函数与re.sub函数功能完全相同,只是re.subn函数会
以一个元组的形式同时返回替换匹配子串后得到的新字符串和替换的
次数。re.subn函数的语法格式为:re.subn(pattern, repl, string, count=0, flags=0)
各参数含义与re.sub函数相同。
import re
str='sno:1810101,name:李晓明,age:19,major:计算机'
re.subn('\\W+','+',str)
Out[18]: ('sno+1810101+name+李晓明+age+19+major+计算机', 7)