Python正则re详解
作者:YXN-python 阅读量:71 发布日期:2024-05-15
1、正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自带了re模块,它提供了对正则表达式的支持。
- 创建正则对象 reg = re.compile(str[,flag])
- 使用正则函数 re.函数名(reg , string [,匹配模式])
-
re.match(pattern, string[, flags]) # 匹配字符串,返回一个Match对象 re.search(pattern, string[, flags]) # 搜索字符串,返回一个Match对象 re.split(pattern, string[, maxsplit]) # 将字符串按照模式分割,返回一个列表 re.findall(pattern, string[, flags]) # 搜索字符串,返回一个匹配列表 re.finditer(pattern, string[, flags]) # 搜索字符串,返回一个迭代器 re.sub(pattern, repl, string[, count]) # 替换字符串中匹配的模式,返回替换后的字符串 re.subn(pattern, repl, string[, count]) # 替换字符串中的内容,返回替换后的字符串和替换次数 re.escape(pattern) # 转义 pattern 中的特殊字符,不能用于 sub() 和 subn() 的替换字符串 re.purge() # 清除正则表达式的缓存。
- 匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M。可选值有
-
re.I(全拼:IGNORECASE): 忽略大小写 re.M(全拼:MULTILINE): 多行模式,改变'^'和'$'的行为 re.S(全拼:DOTALL): 点任意匹配模式,改变'.'的行为,可以匹配 \n
更多详情参考-Python正则re匹配函数
import re
# 构建一个规则
变量 = re.compile( '规则str' ,匹配模式=None )
变量就是正则对象
1、普通字符串
abc : 表示一个 abc 1234 : 表示一个 1234
2、 [ ] 匹配 1 个字符
[ ] : 匹配 1 个字符, 减号- 表示范围 [abcxyz] : 表示 abcxyz 中的一个 [123] : 表示 1 或 2 或 3 [a-z] : 表示 a-z 中的一个,即一个小写字母 [c-k] : 表示 c-k 中的一个 [0-9] : 表示 0-9 中的一个,即一个数字 [A-Z] : 表示一个大写字母 a[1-4] : 表示 a1 或 a2 或 a3 或 a4 [1-9][0-9] : 表示 10-99 ,一个两位数 [10-39] : 表示 0 1 2 3 或 9 [1\-9] : 表示 1 ,减号- ,或 9 [a-zA-Z0-9]: 表示 1 个 字母 或 数字 [\\/:*?"<>|] : 表示 \/:*?"<>| 中的一个,第一个反斜杠,转义用的,这些事windows 中不能作为文件名的符合 [\u4e00-\u9fa5]: 表示一个中文 练习: 表示 a1 a2 a3...a9 b1 b2 ...b9 .c1..d1..h1.. z1 z2 ....z9 [a-z][1-9] 表示一个 130~139 或者 150~159 1[35][0-9]
3、元字符
就是有特殊含义的字符 ,比如上面的 减号,他在 [ ] 中 ,表示范围 下面是几个常用的特殊字符 . : 表示任意一个单字符 或 一个中文。 默认情况下不表示换行 \n 下面是一个表示次数的字符 * : 表示它前面的内容是 任意次数。 如 a* ,表示任意个连续的 a 。如0个a, a ,aa ,aaa ,aaaa ,... + : 表示它前面的内容是 1次以及以上。 如 b+ , 表示一个以上连续 的 b ? : 表示它前面的内容是 0或1次。 如 c? , 表示 没有c 或 1个c 。即有1个或无 如: a[1-9]?b 表示 ab 或 a1b a2b ... a9b ^ 在[]中是取反的作用 [^abc] : 表示不是一个 a或b或c [^0-9] : 表示不是一个数字 ^ 开头的作用 ^ :表示开头。 如 : ^abc ,表示 abc 为开头 $ : 表示结尾。 如 : abc$ ,表示 abc 为结尾 如: ^abc.*xyz$ : 表示某str以 abc 开头中间任意内容,xyz结尾 abc.*xyz : 表示某str中有 'abc中间任意内容xyz'
4、转义字符
有特殊含义的字符,前面放\ ,代表这个字本身 \. \* \? \+ \\ \( \- ... 转义字符 与 字母: \d : 表示一个 0-9 ,相当于[0-9] \D : 表示不是一个0-9,相当于[^0-9] \w : 小写w ,表示 一个字母、数字、下划线、中文 \W : 大写w ,表示 不是一个字母、数字、下划线、中文 \s : 小写s ,表示一个空格 \S : 大写s ,表示不是 一个空格
5、量词
量词 ,修饰前面的内容的 数量 {} a{n} : 表示 n 个连续的 a ,如 a{3} 表示 aaa b{m,n} : 表示 m-n个连续的 b ,如 b{2,4} 表示 bb 或 bbb 或 bbbb c{1,} : 表示 一个以上连续的c,相当于 c+ d{0,} : 表示 0个以上连续的d, 相当于 d* e{0,1} : 表示0或1 个 e,相当于 e? 如: ab{1,3} 表示 ab abb abbb a{1,2}b{1,3} 表示 ab abb abbb aab aabb aabbb
6、组
用括号实现(),常说的整体, 在( ) 中 竖线| 表示 或 (张三|李四) : 表示 张三 或 李四 (abc){2} : 表示 abcabc (ab){1,3} : 表示 ab abab ababab (138|152|18[2-4]) : 表示 138 152 182 183 184 练习: 1、表示 一个 11 位数字的电话号码 ,138打头 138\d{8} 138[0-9]{8} 138\d\d\d\d\d\d\d\d 2、表示 一个11位的电话号码,138开头,最前面的 +86 可有可无 (\+86)?138\d{8} 3、表示 6-11数字组成qq邮箱, 0不能做开头 xxx@qq.com [1-9]\d{5,10}@qq\.com
7、正则的方法
re.findall( pat , 字符串 ) 将 字符串中 符合 pat 规则的内容。以list 的形式 返回 word = 'ab1c123 ab2c456 ab3c789 xb4c' pat = re.compile('ab\d')
8、 贪婪模式和 非贪婪模式
a.*c ,默认是贪婪的,找最长的 符合 axxxc 的结构 a.*?c , 非贪婪的,找到一个短结构就可以
9、查找模式与捕获模式
如果正在中存在 组( ) ,默认认为是 组:整体的概念 如: pat = re.compile( 'a(\d+)c' ) 但是 当把正则 放在 re.findall( pat , str ) 等函数中的时候, 捕获模式: 会匹配 str 中 符合 pat 结构的,但是不是 返回 a数字c 组成的list, 而是捕获 a数字c中间的数字返回。 查找模式: 在括号内最前面加上 ?: ,就是查找模式 如 pat = re.compile( 'a(?:\d+)c' ) re.findall( pat , str ),返回 a数字c 组成的list
10、创建正则的技巧
- 把 统一结构复制下来,然后 去异存同。
- 把去掉的用 .\*?代替, 把你要 保存的用 (.\*?) 代替
- .\*? 与 (.\*?) 前后,必须有 原字符串 中 至少一个字符
小练习
# 抓取51job 首页的城市 名称
from mytools import get_res
url = 'https://www.51job.com/'
res = get_res(url)
reg = re.compile('<span><a href="//www.51job.com/.*?/">(.*?)</a></span>')
result = re.findall( reg , res.text )
print(result)
YXN-python
2024-05-15