re模块提供了和Perl里的正则表达式类似的功能,不管是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮。
正则表达式使用反斜杆()来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义。这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解。比如,要匹配一个反斜杆本身,你也许要用'\\'来做为正则表达式的字符串,因为正则表达式要是\,而字符串里,每个反斜杆都要写成\。
你也可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义,比如r'
'这个字符串就是一个反斜杆加上一字母n,而'
'我们知道这是个换行符。因此,上面的'\\'你也可以写成r'\',这样,应该就好理解很多了。不能理解看另一文:正则转义机制
正则字符匹配很多,参考Python官方的文档:Python正则匹配模式
re.match(pattern, string, flags=0) pattern为正则式,string为要匹配的字符串,flags可以控制正则的匹配方式;如是否区分大小写。
import re >>>a = re.match(r'([0-9a-zA-Z])(@(a-z)+.[com]+)','mzc1997@gmail.com')
>>>print(a.string)
mzc1997@gmail
使用re.search()进行字符串查找
re.search()总是返回第一个查找到的字符串 不会返回其他的
re.search(pattern,string,flags)
import re
>>>re.search(r'd','qwer12345zxc')
<_sre.SRE_Match object; span=(4, 5), match='1'>
使用re.findall()方法查找字符串,结果返回一个匹配结果的list
re.findall(pattern,string,flags)
import re
>>>re.findall(r'd+','qwer12345zxc')
['12345']
使用re.sub()进行正则匹配,然后替换匹配的内容
re.sub(pattern,repl,string,count,flags)
import re
a = re.compile(r'd+')
str1 = 'Q12345Q'
repl = 'mzc1997@gmail.com'
res = re.sub(a,repl,str1)
>>>print(res)
Qmzc1997@gmail.comQ #12345被repl字符串内容替换
使用re.compile() 编译内容为正则字符串
import re
re_mail = re.compile(r'([0-9a-zA-Z]+|[0-9a-zA-Z.]+)(@[a-z]+.[com]+)')
#使用
string = mzc1997@gmail.com
>>>re_mail.match(string)
<_sre.SRE_Match object; span=(0, 17), match='mzc1997@gmail.com'>
匹配对象有group方法
group()可以返回子字符串
groups()返回一个被分割开的字符串list
import re
a = re.match(r'([0-9a-zA-Z]+)(@[a-z].[com]+)','mzc1997@gmail.com')
>>>a.group(0) #0返回完整字符串
'mzc1997@gmail.com'
>>>a.group(1) #返回匹配的第一项子串
'mzc1997'
>>>a.group(2) #返回匹配的第二项子串
'@gmail.com'
>>>a.groups() #返回一个被分割开的字符串list
('mzc1997','@gmail.com')
返回的子串有多少,取决于你在正则中如何把字符串分开匹配,也就是括号问题()。
正则不仅用于匹配字符串,还可以用来切分字符串
使用re.split(pattern,string)来切分
>>>a = 'a b c'
>>>a.split(' ')
['a', 'b', '', 'c'] #无法切分连续的空格
>>>re.split(r's+',a) #无论字符串夹杂什么字符,只要在正则中写匹配式,都可以完全切分
['a', 'b', 'c']
贪婪匹配
正则匹配默认是贪婪匹配,会尽可能多的匹配字符
import re
>>>a = re.match(r'd+','123456')
>>>print(a.string)
'123456'
>>>a = re.match(r'd+?','123456')
>>>print(a.string)
'1'
一个问号就可以将贪婪匹配变为非贪婪匹配。