官方文档:
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 返回产生这个实例的 正则对象
  1. import re
  2. fileContent = open("E:\\pythonstduy\\ex.html").read()
  3. ##获取<title></title>中间的文字
  4. result = re.search(r"<title>(.*?)</title>", fileContent,re.IGNORECASE)
  5. print(result.group(1))
  6. ##结果
  7. Example HTML file
  8. ex.html
  9. <html>
  10. <head>
  11. <title> Example HTML file</title>
  12. </head>
  13. <body>
  14. <h1 style = "text-align: center">
  15. choose
  16. </h1>
  17. <u1>
  18. <li>http://www.python.org</li>
  19. <li>http://www.iso.org</li>
  20. <li>http://www.w3.org</li>
  21. <li>http://www.midi.org</li>
  22. <li>http://www.mpeg.org</li>
  23. </u1>
  24. </body>
  25. </html>
  26. html中如果存在中文的话,就会报下面的错
  27. UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 149: illegal multibyte sequence
  1. import re
  2. ##打开文件
  3. fileContent = open("E:\\pythonstduy\\ex.html").read()
  4. ##设置正则表达式
  5. pattern = re.compile(r"(http://[\w-]+(?:\.[\w-]+)*(?:/[\w-]*)*(?:\.[\w-]*)*)")
  6. ##寻找正则表达式内所有匹配正则表达式的字符串
  7. re.findall(pattern,fileContent)
  8. ##将匹配正则表达式的字符串,以超级链接类型的新字符串取代
  9. result = re.sub(pattern,r"<a href =\1>1</a>",fileContent)
  10. ##打开新文件
  11. file =open("E:\\pythonstduy\\new.html",'w')
  12. ##写入新文件
  13. file.write(result)
  14. file.close()
  15. <html>
  16. <head>
  17. <title> Example HTML file</title>
  18. </head>
  19. <body>
  20. <h1 style = "text-align: center">
  21. choose
  22. </h1>
  23. <u1>
  24. <li><a href =http://www.python.org>1</a></li>
  25. <li><a href =http://www.iso.org>1</a></li>
  26. <li><a href =http://www.w3.org>1</a></li>
  27. <li><a href =http://www.midi.org>1</a></li>
  28. <li><a href =http://www.mpeg.org>1</a></li>
  29. </u1>
  30. </body>
  31. </html>