re模块
前两天写课设的时候需要用爬虫,乘此机会把正则表达式学了一下。
写这篇文章也是为了总结一下(方便以后忘了的时候查表2333)
正则表达式简介
在处理字符串或是网页时,经常会查找具有某些特定规则的字符串,这时正则表达式就会使得该过程很方便。
正则表达式中的特殊字符含义
字符 | 在正则表达式中的含义 | 例子 | 匹配结果(随机举例) |
---|---|---|---|
. | 匹配除了换行符之外任意字符 | g…d | good |
\ | 特殊字符转义成普通字符 | $ | $ |
* | 匹配一个字符串0次或多次 | (aa)* | aa |
+ | 匹配一个字符串1次或多次 | (ab)* | ab |
? | 匹配一个字符串0次或1次 | (asd)? | ‘asd’ or ‘’ |
^ | 匹配字符串的开头 | ^(asd) | asd开头的字符串 |
$ | 匹配字符串的结尾 | (.exe)$ | .exe结尾的字符串 |
| | 匹配左右表达式任意一个 | abc|123 | 匹配abc或123 |
{} | {M}匹配M次,{M,}至少M次,{M,N}M到N次 | a{2,3} | aaa |
[] | 对应的字符可以是字符集中任意字符,-表示范围,^表示取反,所\有特殊字符失去特殊含义 | a[a-z]b | azb |
() | 分组作为一个整体 | a(123|456)c | a123c |
几点补充:
1.在上述带有次数限定的字符后增加’?’,意思为懒惰匹配,即尽可能少的重复
2.在正则表达式前面加上字符r,表示特殊字符按原始意义处理
预定义的字符集
字符集 | 在正则表达式中的含义 | 例子 | 匹配结果(随机举例) |
---|---|---|---|
\d | 匹配数字 | \daa | 1aa |
\D | 匹配非数字 | \Daa | aaa |
\s | 匹配任何空白字符 | a\sa | a a |
\S | 匹配非空白字符 | a\Sa | aaa |
\w | 字母/数字字符/下划线/汉字 | a\wa | a_a |
\W | 匹配特殊字符 | a\Wa | a$a |
\A | 仅匹配字符串开头 | ||
\Z | 仅匹配字符串结尾 | ||
\b | 表示单词的分界处 | ||
\B | \B的反集 |
一些例子
- ^\d{5, 12}$:
5-12个数字 - 0\d{2}-\d{8}:
电话号码格式 - \b\w{6}\b:
6个字符的单词 - (?0\d{2}[)-]?\d{8}:
(010)88886666,或022-22334455 - ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):
ip地址
更多有关 组 的问题后续再补充吧
库函数
- 有关参数flag
re.I:忽略大小写
re.L:特殊字符集依赖当前环境
re.M:多行模式
re.S:’.'包括换行符
re.U:特殊字符集依赖Unicode字符属性 - reObj = re.compile(pattern[, flags])
把正则表达式语法转换为正则表达式对象 - re.search(pattern, string[, flags])
reObj.search(string[, pos[, endpos]])
在string中查找匹配pattern的位置,返回MatchObject的实例,没找到返回None - re.match(pattern, string[, flags])
reObj.match(string[, pos[, endpos]])
只在字符串开始位置尝试匹配正则表达式 - re.split(pattern, string[, maxsplit=0, flags=0])
将字符串匹配正则表达式的部分分隔开,并返回列表 - re.findall(pattern, string[, flags])
reObj.findall(string[, pos[, endpos]])
找到字符串中匹配的所有子串,返回列表 - re.finditer(pattern, string[, flags])
reObj.finditer(string[, pos[, endpos]])
和findall类似,返回迭代器 - re.sub(pattern, repl, string[, count, flags])
reObj.reObj(repl, string[, count=0]])
在字符串中找到匹配的子串,用repl替换,没找到则返回string - re.sub(pattern, repl, string[, count, flags])
reObj.reObj(repl, string[, count=0]])
与sub类似,不同处在于还会返回新字符串和替换的次数