day5-re

re模块

1. 正则表达式符号

 1 '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
 2 '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
 3 '$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
 4 '*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
 5 '+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
 6 '?'     匹配前一个字符1次或0次
 7 '{m}'   匹配前一个字符m次
 8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
 9 '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11 '\'     转义
12  
13 [a-z]   匹配[a-z]
14 [A-Z]   匹配[A-Z]
15 [0-9]   匹配数字0-9
16 '\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
17 '\Z'    匹配字符结尾,同$
18 '\d'    匹配数字0-9
19 '\D'    匹配非数字
20 '\w'    匹配[A-Za-z0-9]
21 '\W'    匹配非[A-Za-z0-9]
22 '\s'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
23 '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 
24 结果:{'province': '3714', 'city': '81', 'birthday': '1993'}

2. 匹配方法

 1 >>> import re
 2 # 从字符串开头开始匹配
 3 >>> a = re.match('in',"inet addr:10.161.146.134")
 4 >>> a.group()
 5 'in'
 6 # 在字符串中寻找匹配字符,找到返回
 7 >>> a = re.search('addr',"inet addr:10.161.146.134")
 8 >>> a.group()
 9 'addr'
10 # 把匹配到的字符以列表的形式返回
11 >>> re.findall('[0-9]{1,3}',"inet addri:10.161.146.134")
12 ['10', '161', '146', '134']
13 # 已匹配到的字符为分割符进行分割,返回列表
14 >>> re.split('\.',"inet addri:10.161.146.134")
15 ['inet addri:10', '161', '146', '134']
16 # 匹配字符并替换,count表匹配次数
17 >>> re.sub('\.','-',"inet addri:10.161.146.134",count=2)
18 'inet addri:10-161-146.134'
19 # 返回迭代器
20 >>> b = re.finditer('addr',"inet addr:10.161.146.134")
21 >>> b
22 <callable-iterator object at 0x030B3990>
23 >>> b.next().group()
24 'addr'

3. 常用方法

group() #获得匹配的字符串,默认值为0,即整个匹配的字符串
groups() #以元组形式返回全部匹配的字符串

 1 >>> a = re.search('(\d+)\.(\d+)\.(\d+).*',"inet addri:10.161.146.134")
 2 >>> a
 3 <_sre.SRE_Match object at 0x03131CA0>
 4 >>> a.group()
 5 '10.161.146.134'
 6 >>> a.group(0)
 7 '10.161.146.134'
 8 >>> a.group(1)
 9 '10'
10 >>> a.groups()
11 ('10', '161', '146')

groupdict() #返回别名为键、匹配到的字符串为值的字典,没有别名的组不包含在内

1 >>> a = re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242")
2 >>> a.groupdict()
3 {'province': '3714', 'city': '81', 'birthday': '1993'}

span() #返回匹配字符串的起始位置和结束位置

start() #返回匹配字符串的起始位置

end() #返回匹配字符串的结束位置

1 >>> a.span()
2 (0, 10)
3 >>> a.start()
4 0
5 >>> a.end()
6 10

compile() #根据创建的正则对象进行匹配

1 # 创建正则对象
2 >>> m = re.compile("addr")
3 # 根据正则对象进行匹配
4 >>> n = m.search("inet addr:10.161.146.134")
5 >>> n.group()
6 'addr'

4. 匹配模式

re.I(re.IGNORECASE): 忽略大小写
re.M(MULTILINE): 多行模式,改变'^'和'$'的行为
re.S(DOTALL): 点任意匹配模式,改变'.'的行为

5. 小结

a. 用r''的方式表示的字符串叫做raw(原生)字符串,用于抑制转义

b. 正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义

c. 如果需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\",

前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里

转义成一个反斜杠,raw表达式为r'\\'

posted @ 2017-06-18 23:38  不知所以  阅读(86)  评论(0)    收藏  举报