正则表达式在我看来是提供一个模板,将待匹配的字符串与模板匹配,匹配不到则返回为空,匹配成功根据需要返回匹配的字符串。
正则表达式比字符串本身的功能要强一点,当然性能上略有不如。
我们使用正则表达式主要有两种目的,
> 是否包含模板字符串;
> 得到匹配字符串。
python 中使用正则表达式时需要引入“re”模块,为了避免记忆上的混乱,本文只记载一种最常用的使用正则表达式的方式。
使用流程:
1 # encoding:utf-8 2 3 # 引入re模块 4 import re 5 6 #生成正则表达式模板 7 pat = re.compile(r'12') 8 9 #匹配结果10 m=pat.search("123 12")11 print m12 13 #匹配结果14 m=pat.search("3 2")15 print m16 17 # 输出:18 # <_sre.SRE_Match object at 0x01FCFB48>19 # None
match()和search()区别
在一些示例中,在匹配结果也会用到match方法,match和search的区别如下:
match :只从字符串的开始与正则表达式匹配,匹配成功返回matchobject,否则返回none;
search :将字符串的所有字串尝试与正则表达式匹配,如果所有的字串都没有匹配成功,返回none,否则返回matchobject;
示例如下:
pat = re.compile(r'12')m=pat.search("312")print m# <_sre.SRE_Match object at 0x01FCFB48>m=pat.match("312")print m# Nonem=pat.match("123")print m# <_sre.SRE_Match object at 0x01FCFB48>
分组的概念和findall()
当我们想将符合正则规则的字符串提取时,可以用()将规则包起来即可。例如:我们想提取超链接
pat = re.compile(r'href="([^"]*)"')s = '起点中文'm = pat.search(s)print m.group(0)# href="http://www.qidian.com/print m.group(1)# http://www.qidian.com/
“()”表示我们想要提取的字符串内容,用group()函数方法取得,group(0) 取得匹配的字符串,group(1)取得第一个分组。
当要取得所有符合规则的字符串时我们可使用findall()方法
pat = re.compile(r'href="([^"]*)"')s = '起点中文起点中文'm = pat.findall(s)print m#['http://www.qidian.com/', 'http://www.qidian.com/']
此时若匹配返回的结果是一个list。
反斜杠的困扰
pat = re.compile(r'href="([^"]*)"')
正则里面有个‘r’是原生字符串的意思,它表示不转义,例如:
path="c:\noway"print path# c:# owaypath=r"c:\noway"print path# c:\noway
正则表达式用”\\”表示反斜杠符号,因此当要匹配字符串中的“\\”时需要用“\\\\”,前两个表示一个反斜杠即转义字符,后两个表示真正的反斜杠。当加上前缀r时,就只用“\\”匹配反斜杠。
示例如下:
re_str_patt = "\\\\"reObj = re.compile(re_str_patt)str_test = "abc\\cd\\hh"print reObj.findall(str_test)# ['\\', '\\']r_str_patt = r"\\"print reObj.findall(str_test)# ['\\', '\\']