Python模块-re模块
re正则匹配,如果没有匹配到就返回None,匹配结果加上.group()就会以字符串形式返回匹配结果
-
re的匹配语法
re.match() 从头开始匹配
>>> re.match('ab','abcdefg') <_sre.SRE_Match object; span=(0, 2), match='ab'> >>> re.match('ab','cabdefg')
只能从左边第一个开始匹配
re.search() 匹配包含
>>> re.search('ab','abcdefg') <_sre.SRE_Match object; span=(0, 2), match='ab'> >>> re.search('ab','cabdefg') <_sre.SRE_Match object; span=(1, 3), match='ab'>
从字符串中的任意位置开始匹配
re.match()和re.search()方法只能匹配一次,如果要匹配全部的结果,可以使用re.findall()
re.findall() 把所有匹配到的字符放入列表中
>>> re.findall('ab','abcdefabcdefab') ['ab', 'ab', 'ab']
re.split() 以匹配到的字符当做列表分隔符,来把元素分开
>>> re.split('\+','ab+c+d+ef+gh') ['ab', 'c', 'd', 'ef', 'gh']
因为“+”为匹配规则,所以需要用转义符把“+”转义为普通的“+”
re.sub() 匹配字符并替换
>>> re.sub('\.','5','org.cn.net.com.gov') 'org5cn5net5com5gov' >>> re.sub('\.','5','org.cn.net.com.gov',count=2) 'org5cn5net.com.gov'
count为替换的次数
re.fullmatch() 匹配全部
>>> re.fullmatch('python','python') <_sre.SRE_Match object; span=(0, 6), match='python'>
要整个字符串完全匹配
re.compile(pattern, flags=0) 匹配规则
>>> test = re.compile('[TH]+',flags=re.I) >>> test.search('python').group() 'th'
-
re常用的表达式规则
'.' 默认匹配除\n之外的任意一个字符
>>> re.match('.','python') <_sre.SRE_Match object; span=(0, 1), match='p'> >>> re.match('.','java') <_sre.SRE_Match object; span=(0, 1), match='j'> >>> re.findall('.','ja\nva') ['j', 'a', 'v', 'a']
'^'和'\A' 从字符串开头开始匹配
>>> re.match('p','python') <_sre.SRE_Match object; span=(0, 1), match='p'> >>> re.search('^p','python') <_sre.SRE_Match object; span=(0, 1), match='p'> >>> re.search('\Ap','python') <_sre.SRE_Match object; span=(0, 1), match='p'>
以上三种匹配都是只从左边第一个开始匹配
'$'和'\Z' 从字符串结尾开始匹配
>>> re.search('on$','python') <_sre.SRE_Match object; span=(4, 6), match='on'> >>> re.search('on\Z','python') <_sre.SRE_Match object; span=(4, 6), match='on'>
'*' 匹配*号前的字符0次或多次
>>> re.search('ab*','abbbcabbcd') <_sre.SRE_Match object; span=(0, 4), match='abbb'> >>> re.search('(ab)*','ababababcabbcd') <_sre.SRE_Match object; span=(0, 8), match='abababab'> >>> re.search('f*','ababababcabbcd') <_sre.SRE_Match object; span=(0, 0), match=''>
f没有匹配到,返回了空,而不是None
'+' 匹配前一个字符1次或多次
>>> re.search('ab+','abbbcabbcd') <_sre.SRE_Match object; span=(0, 4), match='abbb'> >>> re.search('(ab)+','ababababcabbcd') <_sre.SRE_Match object; span=(0, 8), match='abababab'> >>> re.search('f+','ababababcabbcd')
f没有匹配到,所以返回None
'?' 匹配前一个字符1次或0次
>>> re.search('ab?','abbbbc') <_sre.SRE_Match object; span=(0, 2), match='ab'> >>> re.search('d?','abbbbc') <_sre.SRE_Match object; span=(0, 0), match=''>
'[...]' 匹配[]中的字符,[0-9]为数字,[a-z]为全部小写字母,[A-Z]为全部大写字母,[A-Za-z0-9]为全部大小写字母和数字
>>> re.findall('[pto]','python') ['p', 't', 'o'] >>> re.findall('[a-z]','python') ['p', 'y', 't', 'h', 'o', 'n'] >>> re.findall('[A-Z]','PyThoN') ['P', 'T', 'N'] >>> re.findall('[0-9]','sch01ar') ['0', '1'] >>> re.findall('[A-Za-z0-9]','PyTh0n!@#') ['P', 'y', 'T', 'h', '0', 'n']
'[^...]' 匹配不在[]中的字符
>>> re.findall('[^pto]','python') ['y', 'h', 'n'] >>> re.findall('[^A-Z]','PyThoN') ['y', 'h', 'o'] >>> re.findall('[^a-z]','PyThoN') ['P', 'T', 'N'] >>> re.findall('[^0-9]','sch01ar') ['s', 'c', 'h', 'a', 'r'] >>> re.findall('[^a-zA-Z0-9]','sch01ar') []
'{m}' 匹配前一个字符m次
>>> re.search('[0-9]{3}','12345') <_sre.SRE_Match object; span=(0, 3), match='123'>
匹配数字3次
'{n,m}' 匹配前一个字符n到m次
>>> re.findall('[0-9]{2,4}','abc1abcd12ab123abcde1234abcdef12345abc') ['12', '123', '1234', '1234']
匹配2到4位的0-9的数字
'|' 匹配|左或|右的字符
>>> re.findall('h|n','pythonandphp') ['h', 'n', 'n', 'h'] >>> re.findall('h|b','pythonandphp') ['h', 'h'] >>> re.findall('b|h','pythonandphp') ['h', 'h'] >>> re.search("abc|ABC","ABCBabcCD").group() 'ABC'
|右边优先于左边
'(...)' 分组匹配
>>> re.search("(abc){2}a(123|45)", "abcabca456c").group() 'abcabca45' >>> re.search("(abc){2}a(123|45)", "abcabca456c").groups() ('abc', '45')
groups()返回为元组
'(?P<name>...)' 分组匹配
>>> re.search("(?P<year>[0-9]{4})(?P<month>[0-9]{2})(?P<day>[0-9]{2})",'19930519').groupdict() {'year': '1993', 'day': '19', 'month': '05'}
groupdict()以字典形式返回
'\d' 匹配数字0-9
>>> re.findall("\d", "abc123abc456abc") ['1', '2', '3', '4', '5', '6'] >>> re.findall("\d+", "abc123abc456abc") ['123', '456']
'\D' 匹配非数字
>>> re.findall("\D+", "abc123abc456abc") ['abc', 'abc', 'abc']
'\w' 匹配[A-Za-z0-9]
>>> re.findall("\w+", "ab-c12*3abc#456") ['ab', 'c12', '3abc', '456']
'\W' 匹配非[A-Za-z0-9],也可以匹配空白字符、\t、\n、\r
>>> re.findall("\W+", "ab-c12*3abc#456") ['-', '*', '#']
'\s' 匹配空白字符、\t、\n、\r
>>> re.findall("\s+", "ab bc \ndef\twed\r123") [' ', ' \n', '\t', '\r']
'\S' 匹配非空白字符、\t、\n、\r
>>> re.findall("\S+", "ab bc \ndef\twed\r123") ['ab', 'bc', 'def', 'wed', '123']
-
Flags标志位
flags标志位,用于控制正则表达式的匹配方式
括号内是完整写法
I(IGNORECASE): 忽略大小写
>>> re.findall("[a-z]", "Sch01aR",re.I) ['S', 'c', 'h', 'a', 'R'] >>> re.findall("[a-z]", "Sch01aR",re.IGNORECASE) ['S', 'c', 'h', 'a', 'R']
M(MULTILINE): 多行模式,改变'^'和'$'匹配开头结尾的行为
>>> re.search('[ef]+','abc\nefg\nhij',flags=re.M).group() 'ef' >>> re.search('[ef]+','abc\nefg\nhij',flags=re.MULTILINE).group() 'ef'
S(DOTALL): 改变'.'的行为,也能匹配\n
>>> re.search('.+','abc\nefg\nhij',flags=re.S).group() 'abc\nefg\nhij' >>> re.search('.+','abc\nefg\nhij',flags=re.DOTALL).group() 'abc\nefg\nhij'
X(VERBOSE): 给匹配规则加上注释
>>> re.search('[0-9]+ #匹配一个或多个0-9的数字','abc123cde456fgh',re.X).group() '123' >>> re.search('[0-9]+ #匹配一个或多个0-9的数字','abc123cde456fgh',re.VERBOSE).group() '123'