在个别的后端语言中都有正则表达式的应用,集体感觉正则表达式的难点就是有比拟多的元字符比拟难记,所以倡议大家珍藏。而在 python 的编程中,特地是爬虫之后的数据筛选、荡涤等操作都须要对字符串进行大量的操作,应用正则表达式无疑是最简便的一种字符串解决操作。
1、正则表达式的元字符及组装模式
首先,正则表达式就是由一个一个的元字符组合起来的一个字符串,而后以这个字符串作为格局去匹配任意的字符串最初生成新的数据文本。那么,先来看一下在 python 中像这样的元字符到底有哪些。
1. 匹配任意字符(不包含换行符)2^ 匹配开始地位,多行模式下匹配每一行的开始
3$ 匹配完结地位,多行模式下匹配每一行的完结
4* 匹配前一个元字符 0 到屡次
5+ 匹配前一个元字符 1 到屡次
6? 匹配前一个元字符 0 到 1 次
7{m,n} 匹配前一个元字符 m 到 n 次
8 转义字符,跟在其后的字符将失去作为非凡元字符的含意,例如. 只能匹配.,不能再匹配任意字符
9[] 字符集,一个字符的汇合,可匹配其中任意一个字符
10| 逻辑表达式 或,比方 a|b 代表可匹配 a 或者 b
11(...) 分组,默认为捕捉,即被分组的内容能够被独自取出,默认每个分组有个索引,从 1 开始,依照 "(" 的程序决定索引值
12(?iLmsux) 分组中能够设置模式,iLmsux 之中的每个字符代表一个模式, 用法参见 模式 I
13(?:...) 分组的不捕捉模式,计算索引时会跳过这个分组
14(?P<name>...) 分组的命名模式,取此分组中的内容时能够应用索引也能够应用 name
15(?P=name) 分组的援用模式,可在同一个正则表达式用援用后面命名过的正则
16(?#...) 正文,不影响正则表达式其它局部, 用法参见 模式 I
17(?=...) 程序必定环视,示意所在位置右侧可能匹配括号内正则
18(?!...) 程序否定环视,示意所在位置右侧不能匹配括号内正则
19(?<=...) 逆序必定环视,示意所在位置左侧可能匹配括号内正则
20(?<!...) 逆序否定环视,示意所在位置左侧不能匹配括号内正则
21(?(id/name)yes|no) 若后面指定 id 或 name 的分区匹配胜利则执行 yes 处的正则,否则执行 no 处的正则
22number 匹配和后面索引为 number 的分组捕捉到的内容一样的字符串
23A 匹配字符串开始地位,疏忽多行模式
24Z 匹配字符串完结地位,疏忽多行模式
25b 匹配位于单词开始或完结地位的空字符串
26B 匹配不位于单词开始或完结地位的空字符串
27d 匹配一个数字,相当于 [0-9]
28D 匹配非数字, 相当于 [^0-9]
29s 匹配任意空白字符,相当于 [tnrfv]
30S 匹配非空白字符,相当于 [^ tnrfv]
31w 匹配数字、字母、下划线中任意一个字符,相当于 [a-zA-Z0-9_]
32W 匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]
起源阐明:以上元字符表阐明援用自“博客园,菜鸟的日常”
2、python 的内置模块 re 操作正则表达式的模式
python 的 re 模块提供了很多内置的函数来操作正则表达式,把握正则表达式以及这些函数的应用会更大的进步工作效率,因为大多时候都是在和字符串打交道。并且 re 模块在应用这些函数来操作正则表达式的时候都能够指定不同类型的模式。比方:re 内置模块的 compile(pattern, flags=0) 函数中的 flags 参数就是用于指定匹配模式的,默认状况下各个内置函数的模式都等于零就是不指定模式。
1re.I 使匹配对大小写不敏感
2re.L 做本地化辨认(locale-aware)匹配
3re.M 多行匹配,影响 ^ 和 $
4re.S 使 . 匹配包含换行在内的所有字符
5re.U 依据 Unicode 字符集解析字符。这个标记影响 w, W, b, B.
6re.X 该标记通过给予你更灵便的格局以便你将正则表达式写得更易于了解。
3、re 模块函数匹配正则表达式操作字符串
compile(pattern, flags=0) 对匹配的正则表达式进行预编译,这种模式有利于后续对同一种匹配规定的复用,当然也能够不进行预编译应用 re 模块的内置函数间接进行正则表达式的应用。
findall(pattern, string, flags=0) 找到所有的匹配当前的数据,并且应用列表的模式返回匹配后的数据。
1# 导入 re 内置模块
2import re
3# 定义多行字符串 sc
4sc = '''str1
5str2
6str3'''
7
8# 应用 compile() 函数进行正则表达式对预编译
9# 其中正则表达式为 <.+> 参照元字符表,表达式中 <.> 示意匹配任意字符(不包含换行符)10# <+> 示意匹配前一个元字符 1 到屡次,组合 <.+> 就示意匹配所有字符不包含换行符
11pattern = re.compile(".+")
12# 正则表白对象调用 findall() 函数返回列表
13print pattern.findall(sc)
14# 打印返回列表,后果应该是上面列表
15['str1', 'str2', 'str3']
split(pattern, string, maxsplit=0, flags=0) 依照正则表达式匹配的数据为切割点,对原来的数据进行切分并返回一个数据列表。
1# 定义原始字符串
2sc = '''strw 1 laow
3 strd 2 laow
4 strc 3 laow'''
5# 依照数字切分
6print re.split('d+', sc)
7# 打印后果
8['strw', 'laown strd', 'laown strc', 'laow']
sub(pattern, repl, string, count=0, flags=0) 匹配正则表达式的字符串并且替换成指定的字符串后返回。
1# 导入内置模块 re
2import re
3# 定义原始字符串
4sc = "the sum of 6 and 9 is [6+9]."
5# 将 [6+9] 替换为 15
6print re.sub('[6+9]', '15', sc)
7# 打印后果
8the sum of 7 and 9 is 15.
search(pattern, string, flags=0) 查找正则表达式内容。
1# 导入内置模块 re
2import re
3# 定义原始数据
4sc = '''strw 1 laow
5 strd 2 laow
6 strc 3 laow'''
7# 找到第一个以 t 结尾的字符串
8sc_res = re.search('tw+', sc)
9# 必须应用返回对象的 group() 函数能力打印出值,因为 search() 函数返回的是对象
10print sc_res.group()
escape(pattern) 字符串的本义函数,当须要解决的字符串中蕴含正则表达式中的元字符时必须对原正则表达式进行本义,否则会导致匹配不正确。
1# 导入内置模块 re
2import re
3# 定义原始字符串
4sc = ".+d222"
5# 将正则表达式 <.+d222> 进行本义
6pattern_str = re.escape(".+d222")
7# 打印转移后的正则表达式
8print pattern_str
9# 打印后果
10.+d222
11# 打印匹配后的字符串
12print re.findall(pattern_str, sc)
13# 打印后果
14['.+d222']
4、总结
除了上述第三点中列举的常见内置函数的应用,还有对于 python 内置的正则表达式的用法还有分组、环视等应用办法。可能帮忙咱们解决字符串的大多数问题,正则表达式在 python 中的应用十分弱小、也是后端语言中应用比拟高的,倡议大家珍藏。
更多精彩返回微信公众号【Python 集中营】,专一后端编程实战,原创文章每天更新!