更新日期: 2021.03.31
本节内容 :
前面的 re 学习笔记内容源自官网文档,逐一介绍了 re 的的诸多才艺。
本节将从 how to 的视角总结常用方法。
目录
1. 分析目标信息在文档中出现的规律
get 网页代码,查看,分析, 略~~
2. 确定查找工具 - 目标是一个还是多个?每个目标出现一次还是多次?
3. 确定需匹配的字符串 - 目标信息有规律,还是 TA 的上下文有规律?
目标信息有规律: 例如,把文档中的数字找出来,compile 一个符合目标信息的 pattern。
目标信息的上下文有规律:例如,“今日要闻:XXXXXX。
pattern = re.compile(r'\d+')
print(pattern.search("abc123xyz").group()) # 123
print(re.search('今日要闻:(.*?)。',"今日要闻:XXXXXX。").group()) # 今日要闻:XXXXXX。
4. 为需匹配的字符串设计匹配方法
4.1 匹配单个字符
- 字符可用来匹配他们自身, 如匹配 “a”
- 某类字符
\d 匹配十进制数字 [0-9]
\D 匹配非数字字符,等价于匹配 [^0-9]
\s 匹配空白字符,等价于类 [ \t\n\r\f\v]
\S 匹配非空白字符,相当于类 [^ \t\n\r\f\v]
\w 匹配字母与数字字符,相当于类 [a-zA-Z0-9_]
\W 匹配非字母与数字字符,相当于类 [^a-zA-Z0-9_] - 一定范围内的字符,使用[ ],如[acm-z$/今天]
- 不在一定范围内的字符,使用[ ^],如[^acm-z$/今天]
- 通配符. (点)匹配除换行符之外的任何内容。使用 (re.S) 后点也可以匹配换行符
4.2 匹配一定数量的字符
- * 匹配零至最多次 (贪婪后缀), 例如,ca*t 将匹配 ‘ct’ (0个),‘cat’ 和 ‘caaat’ 等。
- +匹配一次或多次
- ? 匹配一次或0次 (非贪婪后缀), 例如,home-?brew 匹配 ‘homebrew’ 或 ‘home-brew’。
- {m} 匹配至少 m 次, 如果结果少于 m 个会匹配失败。例如,a{6} 不能匹配5个。
- {m,n} 匹配至少 m 次最多 n 次 (取尽量多) 。
4.3 边界确认 & 开头/结尾
- ^ 匹配行开头, 除非设置了 MULTILINE 标志,否则只会在字符串的开头匹配
- $ 匹配行结尾的元字符, 在 MULTILINE 模式下也可以匹配换行符之前的文本
- \b确认字符边界, 在 Python 字符串中\b 是退格字符, 需使用原始字符串 r 表达
- \B 仅在当前位置不在边界时才匹配
4.4 转义元字符 \ 和原始字符串 r
使用 \ 转义某些字符看起来不美观时,可以在引号前加 r,或把特殊字符放在 [ ] 里。
4.5 常见格式字符串的匹配 (有空再写~~)
先百度/ CSDN ~~~
5. 匹配标记 (re.S | re.I | re.M | re. X)
可组合使用多种编译标志,如,re.I | re.M 。
- S 使 ‘.’ 匹配任何字符,包括换行符
- I 执行不区分大小写的匹配
- M 多行匹配, 使 ^ 和 $ 可以匹配每行开头和结尾
- X 扩展, 允许编写更易读的正则表达式
pat = re.compile(r"""
\s* # Skip leading whitespace
(?P<header>[^:]+) # Header name
\s* : # Whitespace, and a colon
(?P<value>.*?) # The header's value -- *? used to
# lose the following trailing whitespace
\s*$ # Trailing whitespace to end-of-line
""", re.VERBOSE)
6. 常用方法总结~~
7. 其他
re 还有很多其他功能,参见官方文档~
- 同时使用多种匹配方法 A|B
- 选择性匹配 扩展标记法 (?=…) , 扩展标记法 (?!…)
- 等等