文章目录
- 一、常用匹配规则:
- 二、匹配方法——match():
- 1、匹配目标
- 2、通用匹配
- 3、贪婪匹配(.\*)和非贪婪匹配(.*?)
- 4、修饰符
- 5、转义匹配
- 三、匹配方法——search()
- 四、匹配方法——findall()
- 五、匹配方法——sub()
- 六、匹配方法——compile()
正则表达式测试工具:
一、常用匹配规则:
模式 | 描述 |
\w | 匹配字母、数字以及下划线 |
\W | 匹配不是字母数字以及下划线的字符 |
\s | 匹配任意空白字符,等价于[\n\t\r\f] |
\S | 匹配任意非空白字符 |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字的字符 |
\A | 匹配字符串开头 |
\Z | 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结尾,如果存在换行,同时还会匹配换行符 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配一行字符串的开头 |
$ | 匹配一行字符串的结尾 |
. | 匹配除换行符之外任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符在内任意字符 |
[…] | 用来表示一组字符,例:[abc] == 匹配a、b、c |
[^…] | 不在[]中的字符,例:[^abc] == 不匹配a、b、c |
* | 匹配0-N个表达式 |
+ | 匹配1-N个表达式 |
? | 匹配0或1个前面的正则表达式定义的片段,非贪婪匹配 |
{n} | 精准匹配N个前面的表达式 |
{n,m} | 匹配n-m次有前面正则表达式定义的片段,贪婪方式 |
a|b | 匹配a或b |
() | 匹配括号内的表达式,也表示一个组 |
二、匹配方法——match():
从字符串的起始位置匹配正则表达式,匹配成功返回成功结果,失败返回None。
import re
result = re.match('正则表达式', 匹配字符串)
# 结果是SRE_Match对象,证明匹配成功
print(result)
# .group()方法:匹配到的内容
print(result.group())
# .span()方法:匹配结果在原字符串的位置范围
print(result.span())
1、匹配目标
import re
content = 'Hello 12345 world'
# 使用括号将想要提取的子串括起来,使用.group()方法,传入1-N依次获取子串的值
result = re.match('^Hello\s(\d+)\s\w+', content)
print(result.group(1))
# 结果:12345
2、通用匹配
import re
content = 'Hello 12345 world'
# 使用.*(点表示任意字符,星表示0-N个)来无限次的匹配任意字符
result = re.match('^Hello.*world$', content)
print(result.group())
# 结果:Hello 12345 world
3、贪婪匹配(.*)和非贪婪匹配(.*?)
# ——贪婪匹配——
import re
content = 'Hello 12345 world'
# 贪婪匹配下.*会皆可能多的匹配字符,所以将 worl匹配到了.*结果中
result = re.match('^Hello.*(\w+)', content)
print(result.group(1))
# 结果:d
# ——非贪婪匹配——
import re
content = 'Hello 12345 world'
# 非贪婪匹配就是尽可能少的匹配字符,所以在符合整个正则式前提下只给.*匹配了一个空格符
result = re.match('^Hello.*?(s\w+)', content)
print(result.group(1))
# 结果:12345
注: 日常使用中字符串中间尽量使用非贪婪匹配以免出现匹配缺失
字符串结尾使用非贪婪匹配可能匹配不到任何内容
4、修饰符
正则表达式可以包含一些可选修饰符来控制匹配的模式。
.*
不能匹配换行符,所以re.match('正则式', 字符串, re.S)
可以通过加入re.S
修饰符来让.*
可以匹配换行符。
绝大部分HTMl文本都包含换行符,所以尽量都需要加上re.S修饰符,以免出现匹配不到的问题。
修饰符 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符串解析字符。这个标志影响\w、\W、\b、\B |
re.X | 该标志通过给予你更灵活的格式以便将正则表达式写的更易于理解 |
5、转义匹配
当遇到用于正则匹配模式的特殊字符时,在前面加反斜杠 \ 转义即可。
三、匹配方法——search()
匹配时扫描整个字符串,返回第一个成功匹配的结果,如果搜索完还没找到匹配的字符串则返回None。
因此为了匹配方便,尽量使用search()
方法。
import re
result = re.search('正则表达式', 匹配字符串)
# 结果是SRE_Match对象,证明匹配成功
print(result)
# .group()方法:匹配到的内容
print(result.group())
# .span()方法:匹配结果在原字符串的位置范围
print(result.span())
四、匹配方法——findall()
该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。
有返回结果的话就是列表类型,所以需要遍历一遍依次获取每组内容。
提取多个内容时,可以用findall()
方法;提取一个内容时,可以使用search()
方法。
import re
result = re.findall('正则表达式', 匹配字符串)
# 结果是列表类型,列表内的每个元素都是元组类型
for i in result:
print(i)
print(i[0], ..., i[n])
五、匹配方法——sub()
可以使用sub()
方法修改文本。
可以使用sub()
方法替换目标字符串中的无用选项为空,然后进行提取操作。
import re
re.sub('正则表达式', '替换成的字符串', 原字符串)
六、匹配方法——compile()
这个方法可以将正则字符串编译成正则表达式对象,以便后面的匹配中复用正则表达式。
compile()
方法还可以传入修饰符,如re.S
。
可以说compile()
方法就是给正则表达式做了一层封装,以便更好的代码复用。
import re
pesult = re.compilr('正则表达式')
re.findall(pesule, 匹配字符串)