python正则表达式之使用规则
正则表达式在我看来是提供一个模板,将待匹配的字符串与模板匹配,匹配不到则返回为空,匹配成功根据需要返回匹配的字符串。
正则表达式比字符串本身的功能要强一点,当然性能上略有不如。
我们使用正则表达式主要有两种目的,
> 是否包含模板字符串;
> 得到匹配字符串。
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 m 12 13 #匹配结果 14 m=pat.search("3 2") 15 print m 16 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 # None m=pat.match("123") print m # <_sre.SRE_Match object at 0x01FCFB48>
分组的概念和findall()
当我们想将符合正则规则的字符串提取时,可以用()将规则包起来即可。例如:我们想提取超链接
pat = re.compile(r'href="([^"]*)"') s = '<a href="http://www.qidian.com/">起点中文</a>' 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 = '<a href="http://www.qidian.com/">起点中文</a><a href="http://www.qidian.com/">起点中文</a>' 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: # oway path=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) # ['\\', '\\']