文章目录

  • 一、常用匹配规则:
  • 二、匹配方法——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, 匹配字符串)