正则表达式指预先定义好一个“字符串模板”,通过这个“字符串模板”可以匹配、查找和替换那些匹配“字符串模板”的字符串。
正则表达式的字符含义,推荐Python正则表达式最强整理(速查手册,记得收藏)-优快云博客
1字符串匹配
字符串匹配指验证一个字符串是否符合指定的“字符串模板”,常用于用户输入验证。例如:用户注册时需要填写邮箱,验证邮箱是否有效输入,就需要用到字符串匹配验证。
使用match(p, text)函数进行字符串匹配, 其中的参数p是正则表达式,即字符串模板, text是要验证的字符串。 如果匹配成功,则返回一个Match对象(匹配对象),否则返回None。
示例:
import re
p=r"\w+@QQ\.com" #验证邮箱的正则表达式
email1='123456yy@QQ.com' #待验邮箱
m=re.match(p,email1) #返回非空,则匹配成功
email2='123456yy@163.com'
y=re.match(p,email2)
type(m) #非空
type(y) #空
print(m,y)
由上述结果可以看出,邮箱1与输入的正则表达式匹配成功,其中span表示字符串跨度,邮箱2未成功。 并且上述代码采用了原始字符串r"\w+@QQ\.com"表示,若用普通字符串表示,需要将特殊字符转义,表示为"\\w+@QQ\\.com",而正则表达式本身会存在较多(\),因此用普通字符串表示会比较麻烦,所以一般使用原始字符串表示。
2.字符串查找
字符串查找指从一个字符串中查找匹配正则表达式的子字符串, 常用于数据分析、 网络爬虫等数据处理中。
常用的字符串查找函数如下。
search(p text): 在text字符串中查找匹配的内容,如果找到,则返回第1个匹配的Match对象,否则返回None。 p是正则表达式。
findall(p, text):在text字符串中查找所有匹配的内容,如果找到,则返回所有匹配的字符串列表; 如果一个都没有匹配,则返回None。p是正则表达式。
示例:
import re
p=r"\w+@QQ\.com"
my_email1='my email is 123456yy@QQ.com'
m=re.search(p,my_email1)
he_email2='he email is 123456yy@163.com'
y=re.search(p,he_email2)
ROY=r'Roy|roy|ROY' #(|)表示或
text='Roy is a singer,a writer,I like Roy,roy and ROY '
m2=re.findall(ROY,text)
print(m,y,m2,sep="\n")
由结果可以看出,第一个匹配成功,并且显示匹配成功字符串的位置是(12,27),第二个匹配失败,第三个将text中的重复项全部输出。
3.字符串替换
正则表达式的字符串替换函数是sub(),该函数替换匹配的子字符串,返回值是替换后的字符串,其语法格式如下:
re.sub(p,repl,string,count=0)
其中,参数p,repl,string,count分别表示:正则表达式,用于替换的新字符串,即将被替换的旧字符串,和最大替换数量,默认是0,表示不限制替换数量。
示例:
import re
p=r'\d+'
text='a123b456c789'
repl_text1=re.sub(p,'',text)
repl_text2=re.sub(p,'',text,count=1)
repl_text3=re.sub(p,'',text,count=3)
print(repl_text1,repl_text2,repl_text3,sep="\n")
#abc
#ab456c789
#abc
4.字符串分割
re模块中的split()函数可以进行字符串的分割,其语法格式如下:
re.split(p,string,maxsplit=0)
其中参数p,string,maxsplit分别表示:正则表达式、要分隔的字符串、最大分隔次数,默认是0,即表示没有限制。
import re
p=r'\d+'
text='a123b456c789'
sp_text1=re.split(p,text)
sp_text2=re.split(p,text,maxsplit=1)
sp_text3=re.split(p,text,maxsplit=2)
print(sp_text1,sp_text2,sp_text3,sep="\n")
#['a', 'b', 'c', '']
#['a', 'b456c789']
#['a', 'b', 'c789']