官方文档:
https://docs.python.org/zh-cn/3/library/re.html
一、介绍
re模块可以执行正则表达式(regular expression)的功能。
正则表达式是字符串,包含文本和特殊字符,利用文字与特殊字符的混合,可以定义复杂的字符串匹配与取代类型。
二、正则表达式的特定字符
2.1 特定字符
| 特定字符 | 说明 |
|---|---|
| \w | 匹配字母与数字的字符,包含下划线“”符号 与[A-Za-z0-0]相等 |
| \W | 匹配非字母或数字的字符 与[^A-Za-z0-0_]相等 |
| \s | 匹配white space字符,包含tab、newline、formfeed及换行字符 与[\f\n\r\t\v]相等 |
| \S | 匹配非white space字符 与[^\f\n\r\t\v]相等 |
| \d | 匹配数字 与[0-9]相等 |
| \D | 匹配非数字 与[^0-9]相等 |
| [\b] | 匹配backspace字符 |
| . | 匹配newline以外的任何字符 |
| [……] | 匹配中括号[]内的任何字符 |
| [^……] | 匹配不在中括号[]内的任何字符 |
| [x-y] | 匹配x到y之间的任何字符 |
| [^x-y] | 匹配不在x和y之间的任何字符 |
| {x,y} | 匹配上一个搜索目标的次数至少x次,但是不可以超过y次 |
| {x,} | 匹配上一个搜索目标的次数至少x次 |
| {x} | 匹配上一个搜索目标的次数正好x次 |
| ? | 匹配上一个搜索目标的次数只有一次或没有符合 |
| + | 匹配上一个搜索目标的次数至少一次 |
| * | 匹配上一个搜索慕白哦的次数是任何次数或没有符合 |
| | | 匹配|符号左边或右边的搜索字符 |
| (……) | 将小括号()内的所有搜索字符集成为一个新的搜索字符 |
| \x | 匹配x集中的相同搜索字符 |
| ^ | 匹配字符串的开头,或者在多行模式中匹配每一行的开头 |
| $ | 匹配字符串的结尾,或者在多行模式中匹配每一行的结尾 |
| \b | 匹配字母数字的字符,以及非字母数字的字符之间的字符 |
匹配空字符串,但只在单词开始或结尾的位置。一个单词被定义为一个单词字符的序列。 |
| \B | 匹配不在字母数字的字符,以及非字母数字的字符之间的字符
匹配空字符串,但只在单词开始或结尾的位置。一个单词被定义为一个单词字符的序列。 |
2.2 特殊字符
正则表达式中使用?、*、+或换行符号,需要使用下面的特殊字符
| 特殊字符 | 说明 |
|---|---|
| \f | Form feed |
| \n | Newline |
| \r | 换行 |
| \t | Tab |
| \v | Vertical tab |
| \\ | \符号 |
| \/ | /符号 |
| \. | .符号 |
| \* | *符号 |
| + | +符号 |
| \? | ?符号 |
| \| | |符号 |
| \( | (符号 |
| \) | )符号 |
| \[ | [符号 |
| \] | ]符号 |
| \{ | {符号 |
| \} | }符号 |
| \XXX | 八进制数字XXX所代表的ASCII字符 |
| \xHH | 十六进制数字HH所代表的ASCII字符 |
| \cX | X所代表的控制字符 |
三、re模块的方法
3.1 re.compile(pattern, flags=0)
将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法 match(), search() 以及其他
序列
prog = re.compile(pattern)
result = prog.match(string)
等价于
result = re.match(pattern, string)
3.2 search(pattern, string, flags=0)
扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。
3.3 match(pattern, string, flags=0)
如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的
3.4 fullmatch(pattern, string, flags=0)
如果整个 string 匹配到正则表达式样式,就返回一个相应的匹配对象 。 否则就返回一个 None ;注意这跟零长度匹配是不同的。
搜索没有重复的匹配字符串
3.5 split(pattern, string, maxsplit=0, flags=0)
用pattern 分开 string 。 如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里。如果 maxsplit 非零, 最多进行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一个元素。
3.6 findall(pattern, string, flags=0)
四、对象的属性
4.1 正则表达式对象的方法和属性
| 方法 | 说明 |
|---|---|
| Pattern.search(string[, pos[, endpos]]) | 扫描整个 string 寻找第一个匹配的位置, 并返回一个相应的 匹配对象。如果没有匹配,就返回 None |
| Pattern.match(string[, pos[, endpos]]) | 如果 string 的 开始位置 能够找到这个正则样式的任意个匹配,就返回一个相应的 匹配对象。如果不匹配,就返回 None ; |
| Pattern.flags | 正则匹配标记。这是可以传递给 compile() 的参数,任何 (?…) 内联标记,隐性标记比如 UNICODE 的结合。 |
| Pattern.groups | 捕获到的模式串中组的数量。 |
| Pattern.groupindex | 映射由 (?P |
| Pattern.pattern | 编译对象的原始样式字符串 |
4.2 匹配对象的方法和属性
| 方法 | 说明 |
|---|---|
| Match.expand(template) | 对 template 进行反斜杠转义替换并且返回, |
| Match.group([group1, …]) | 返回一个或者多个匹配的子组。如果只有一个参数,结果就是一个字符串,如果有多个参数,结果就是一个元组(每个参数对应一个项),如果没有参数,组1默认到0(整个匹配都被返回)。 如果一个组N 参数值为 0,相应的返回值就是整个匹配字符串;如果它是一个范围 [1..99],结果就是相应的括号组字符串。如果一个组号是负数,或者大于样式中定义的组数,一个 IndexError 索引错误就 raise。如果一个组包含在样式的一部分,并被匹配多次,就返回最后一个匹配。: |
| Match.getitem(g) | 这个等价于 m.group(g |
| Match.groups(default=None) | 返回一个元组,包含所有匹配的子组,在样式中出现的从1到任意多的组合。 |
| Match.groupdict(default=None) | 返回一个字典,包含了所有的 命名 子组。key就是组名。 default 参数用于不参与匹配的组合;默认为 None。 |
| Match.start([group]) Match.end([group]) |
返回 group 匹配到的字串的开始和结束标号。group 默认为0(意思是整个匹配的子串)。如果 group 存在,但未产生匹配,就返回 -1 |
| Match.span([group]) | 对于一个匹配 m , 返回一个二元组 (m.start(group), m.end(group)) 。 注意如果 group 没有在这个匹配中,就返回 (-1, -1) 。group 默认为0,就是整个匹配。 |
| Match.pos | pos 的值,会传递给 search() 或 match() 的方法 a 正则对象 。这个是正则引擎开始在字符串搜索一个匹配的索引位置。 |
| Match.endpos | endpos 的值,会传递给 search() 或 match() 的方法 a 正则对象 。这个是正则引擎停止在字符串搜索一个匹配的索引位置 |
| Match.string | 传递到 match() 或 search() 的字符串。 |
| Match.re | 返回产生这个实例的 正则对象 |
import refileContent = open("E:\\pythonstduy\\ex.html").read()##获取<title></title>中间的文字result = re.search(r"<title>(.*?)</title>", fileContent,re.IGNORECASE)print(result.group(1))##结果Example HTML fileex.html<html><head><title> Example HTML file</title></head><body><h1 style = "text-align: center">choose</h1><u1><li>http://www.python.org</li><li>http://www.iso.org</li><li>http://www.w3.org</li><li>http://www.midi.org</li><li>http://www.mpeg.org</li></u1></body></html>html中如果存在中文的话,就会报下面的错UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 149: illegal multibyte sequence
import re##打开文件fileContent = open("E:\\pythonstduy\\ex.html").read()##设置正则表达式pattern = re.compile(r"(http://[\w-]+(?:\.[\w-]+)*(?:/[\w-]*)*(?:\.[\w-]*)*)")##寻找正则表达式内所有匹配正则表达式的字符串re.findall(pattern,fileContent)##将匹配正则表达式的字符串,以超级链接类型的新字符串取代result = re.sub(pattern,r"<a href =\1>1</a>",fileContent)##打开新文件file =open("E:\\pythonstduy\\new.html",'w')##写入新文件file.write(result)file.close()<html><head><title> Example HTML file</title></head><body><h1 style = "text-align: center">choose</h1><u1><li><a href =http://www.python.org>1</a></li><li><a href =http://www.iso.org>1</a></li><li><a href =http://www.w3.org>1</a></li><li><a href =http://www.midi.org>1</a></li><li><a href =http://www.mpeg.org>1</a></li></u1></body></html>
