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'\\'

浙公网安备 33010602011771号