定义
Regular Expression, 正则表达式, ⼀种使⽤表达式的⽅式对字符串进⾏匹配的语法规则.
正则的优点:
- 速度快, 效率⾼, 准确性⾼
正则的缺点::
- 新⼿上⼿难度有点⼉⾼.
正则神仙工具:
https://tool.oschina.net/regex/ ——在线正则表达式测试
模 式 | 描 述 |
---|---|
\w | 匹配字母、数字及下划线 |
\W | 匹配不是字母、数字及下划线的字符 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0~9] |
\D | 匹配任意非数字的字符 |
\A | 匹配字符串开头 |
\Z | 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结尾,如果存在换行,同时还会匹配换行符 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配一行字符串的开头 |
$ | 匹配一行字符串的结尾 |
. | 匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出,比如 [amk] 匹配 a、m 或 k |
[^…] | 不在 [] 中的字符,比如 匹配除了 a、b、c 之外的字符 |
* | 匹配 0 个或多个表达式 |
+ | 匹配 1 个或多个表达式 |
? | 匹配 0 个或 1 个前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精确匹配 n 个前面的表达式 |
{n, m} | 匹配 n 到 m 次由前面正则表达式定义的片段,贪婪方式 |
a | b | 匹配 a 或 b |
() | 匹配括号内的表达式,也表示一个组 |
贪婪匹配
improt re
'''
.* → 表示尽可能多的匹配
'''
str: <div>张三</div><span>李四</span><div>王五</div>
reg: <div>.*</div> #所匹配字符串正数第一个<div> 倒数第一个</div>
结果:
<div>张三</div><span>李四</span><div>王五</div>
非贪婪匹配(惰性匹配)
improt re
'''
.*? → 表示尽可少的匹配
'''
str: <div>张三</div><span>李四</span><div>王五</div>
reg: <div>.*?</div> #所匹配字符串正数第一个<div> 正数第一个</div>
结果:
<div>张三</div>
<div>王五</div>
re正则应用
match
- 向match传入要匹配的字符串,以及正则表达式,就可以检测这个正则表达式是否匹配字符串。
match 方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配,就返回 None。
ps:match 方法是从字符串的开头开始匹配的,一旦开头不匹配,那么整个匹配就失败了。它更适合用来检测某个字符串是否符合某个正则表达式的规则
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld', content) #第一个参数传入正则表达式,第二个参数传入要匹配的字符串
print(result)
print(result.group())
print(result.group(1))
print(result.span())
运行结果如下:
<_sre.SRE_Match object; span=(0, 19), match='Hello 1234567 World'>
Hello 1234567 World
1234567
(0, 19)
- 修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。
这个修饰符的作用是匹配包括换行符在内的所有字符,不加修饰符会报错
import re
content = '''Hello 1234567 World_This
is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
print(result.group(1))
运行结果:
1234567
修饰符 | 描 述 |
---|---|
re.l | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使匹配包括换行在内的所有字符 |
re.U | 根据 Unicode 字符集解析字符。这个标志影响 \w、\W、\b 和 \B |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
在网页匹配中,较为常用的修饰符有 re.S 和 re.I
- 转义匹配
如果目标字符串中就包含了匹配模式,如:. () 等,则需要转义,否则匹配不成功
import re
content = '(百度) www.baidu.com'
result = re.match('\(百度 \) www\.baidu\.com', content)
print(result)
结果:
<_sre.SRE_Match object; span=(0, 17), match='(百度) www.baidu.com'>
search
与match用法一致,但不需要从开头进行匹配,它会搜索整个匹配字符串,找到符合正则表达式的第一个内容返回。
findall
获取匹配正则表达式的所有内容
sub
可用来修改文本
import re
content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)
运行结果如下:
aKyroiRixLg
- sub+findall
可先用sub将文本过滤一下,在用findall匹配所有内容
html = re.sub('<a.*?>|</a>', '', html)
print(html)
results = re.findall('<li.*?>(.*?)</li>', html, re.S)
for result in results:
print(result.strip())
compile
可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。
import re
content1 = '2019-12-15 12:00'
content2 = '2019-12-17 12:55'
content3 = '2019-12-22 13:21'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)
运行结果如下:
2019-12-15 2019-12-17 2019-12-22