正则表达式:可以匹配文本片段的模式(匹配模式pattern)
字符串也是一种简单的正则表达式
通配符(可以匹配任何字符):.
如'.ython'可以匹配'python', 也可以匹配'jython'
字符集:用中括号[]括起来的字符集
如'[a-z]','[0-9]','[a-z-0-9]'分别表示字符a到z,0到9,a到z和0到9的任意一个
子模式(subpattern):模式中的一部分,用括号括起来
如'py(tho)n','tho'为一个子模式,也叫组(group),组序号取决于他左侧的括号数,整个模式字符串为第0组('python'),'tho'为第1组(左侧1个括号)
(pattern)*:允许模式重复0次或多次
(pattern)+:允许模式重复1次或多次
(pattern){m, n}:允许模式重复m到n次
如'py(tho)+n'表示中间的'tho'(第1组)可以重复1次或多次,可以匹配'python',也可以匹配'pythothothon'
反转字符集:^
如'[^abc]'表示可以匹配除a,b,c外的任何字符(注意加中括号!)
注意:若^出现在模式的开头,需要对其进行转义
管道符号:|(或)
如'p(ython|attern)'可匹配'python',也可匹配'pattern'
转意符号(对特殊字符进行转义):
如果模式中有.,+,-,*,^,|,]等对匹配模式有特殊意义的符号,则需要进行转义,如模式'www.python.org'中的.表示字符'.',而不是通配符
可选项:在子模式的括号外加?号,表示这个子模式可有可无
如r'(http://)?(www.)?python.org'
可以匹配以下字符串:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
注意:如果?号在子模式的括号内,表示非贪婪模式,默认情况下是贪婪模式,指出现重复运算符时,会尽可能多的匹配,
如pattern = r'*(.+)*',遇到子字符串'*this* is *it*!'时,匹配的是最前面和最后面的*号,
如果令pattern = r'*(.+?)*',?号在括号内,则表示非贪婪模式,尽可能少的匹配,会匹配前两个*号,再匹配后两个*号
匹配字符串开头或结尾:如果只想匹配在开头或结尾出现模式的字符串,模式可以用^(开头)或$(结尾)
如pattern = '^ht+p'(注意不同于反转字符集)会匹配'http://python.org','htttttttp://python.org',但不会匹配'python.http://org'
同理'$ht+p'会会匹配在结尾处出现模式的字符串
re.compile(pattern[, flags])
将以字符串形式写的pattern转为真正的模式对象
如:
1 pattern = re.compile(r''' 2 * # some text 3 ([^*]+) # some text 4 * # some text 5 ''', re.VERBOSE)
表示字符串'*([^*]+)*'被转换为匹配模式,VERBOSE表示re会忽略在模式中添加的空白(空白字符,tab,换行符等)
re.search(pattern, string[, flags]) 或者 pat.search(string)
在字符串中寻找和模式相匹配的第一个子字符串,若能找到会返回MatchObject(值为Ture),否则返回None(值为False),如:
1 if re.search(pat, string): 2 print('found it!')
re.match(pattern, string[, flags])
在给定字符串开头处匹配,有就返回MatchObject(值为Ture),否则返回None(值为False),
如re,match('p', 'python')返回MatchObject,re.match('p', 'www.python.org')返回None
re.split(pattern, string[, maxsplit=0])
用与模式相匹配的匹配项来分割字符串,如:
1 some_text = 'alpha, beta,,,, gamma delta' 2 print(re.split(',+', some_text))
结果:
['alpha', ' beta', ' gamma delta']
如果改成:
1 some_text = 'alpha, beta,,,, gamma delta' 2 print(re.split('[, ]+', some_text))
结果:
['alpha', 'beta', 'gamma', 'delta']
(如果模式包含小括号,括起来的字符组合会散布在分割后的子字符串之间)
re.findall(pattern, string)
以列表形式列出给定模式的所有匹配项
re.sub(pat, repl, string[, count=0])
用给定的替换式(repl)替换字符串string中的与pat相匹配的匹配项,返回替换后的string。如:
1 pat = '{name}' 2 text = 'dear {name}' 3 print(re.sub(pat, 'Mr.Tan', text))
结果:
dear Mr.Tan
re.escape(string)
对字符串中所有可能被解释为正则运算符的字符进行转义,如:
1 pat = re.escape('www.(python)+.org') 2 print(pat) 3 text = 'www.python.org or www.pythonpython.org or www.(python)+.org will be replaced' 4 print(re.sub(pat, 'something', text))
结果:
www.(python)+.org www.python.org or www.pythonpython.org or something will be replaced
匹配对象和组:
match,split,findall等能对字符串进行模式匹配的函数在找到匹配项后都会返回MatchObject对象,这些对象也包含匹配模式中与子模式相对应的
子字符串的信息和组(group)信息
group([group1, ...]) 获取给定子模式(组)的匹配项
start([group]) 返回给定组的匹配项在字符串中的开始位置
end([group]) 返回给定组的匹配项在字符串中的结束位置
span([group]) 返回一个组的开始和结束位置
如:
1 m = re.match('www.(.*).(.{3})', 'www.python.org') 2 print(m) 3 print(m.group(1), m.group(2)) 4 print(m.start(1), m.end(1), m.span(1))
结果:
<_sre.SRE_Match object; span=(0, 14), match='www.python.org'> python org 4 10 (4, 10)
re.sub()一个强大的功能:在替换内容(repl)中使用'\n'表示repl中\n处插入匹配项中第n组的子字符串!再用插入后的repl来替换匹配项!如:
1 emphasis_pat = r'*([^*]+)*' 2 text = 'hello, *world*!' 3 print(re.sub(emphasis_pat, '<em>\1</em>', text))
结果:
hello, <em>world</em>!