元字符匹配
. 匹配任意字符,除了换行符
[^...] 匹配除了字符组中字符的所有字符
\d 匹配任意数字,等价于 [0-9]
\D 匹配任意非数字
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f]
\S 匹配任意非空字符
字符组
要求在一个位置匹配的字符可能出现很多种情况, 各种情况组成一个组
[0123456789]: 匹配0到9任意字符
[0-9]: 同上
[a-z]: 匹配a到z的任意小写字母
[A-Z]: 匹配A到Z的任意大写字母
[0-9a-zA-Z]: 以上三种的组合 匹配0-9任意数组或a到f之间任意字母 不区分大小写
自定义字符组:[a3h5] 匹配a, 3, h, 5等字符
量词
\* 重复零次或多次
\+ 重复一次或多次
? 非贪婪匹配
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
{,m} 重复至多m次
边界修饰符
^ 匹配开始
$ 匹配结尾
分组
在正则表达式中添加(), 就形成了一个分组, 在re模块中优先匹配显示分组内容
import re
s = "<a href=‘www.baidu.com‘>正则匹配实验"</a>
res = re.findall("href=‘(.*)‘>", s)
print(res)
贪婪匹配与非贪婪匹配
贪婪匹配是指: 在使用量词: * , + 等时, 尽可能多的匹配内容 直到不满足匹配条件为止
非贪婪匹配是指: 使用?对正则表达式进行修饰 使量词的匹配尽可能少 尽可能的少匹配
匹配模式:
re.S 单行模式(重点)
re.M 多行模式
re.I 忽略大小写
import re
s = ‘hello2world\nhello3world\nhello4world‘ #re.M 多行模式
result0 = re.findall(r‘\d.*d‘, s)
print(result0)
result1 = re.findall(r‘\d.*d‘, s, re.M)
print(result1)
#re.S 单行模式(可以看成将所有的字符串放在一行内匹配包括换行符\n)
result2 = re.findall(r‘\d.*d‘, s, re.S)
print(result2)
result3 = re.findall(r‘\d.*?d‘, s, re.S)
print(result3)
re模块
re并不是正则 re是python为正则提供的接口模块
1.re.findall(‘正则表达式‘, ‘文本‘): 返回所有满足匹配条件的结果, 以列表形式返回
2.re.search(‘正则表达式‘, ‘文本‘): 匹配到第一个就返回一个对象, 该对象使用group()进行取值, 如果未匹配到则返回None
3.re.match(‘正则表达式‘, ‘文本‘): 只从字符串开始进行匹配, 如果匹配成功返回一个对象, 同样使用group()进行取值, 匹配不成功返回None
4.re.compile(‘正则表达式‘): 将正则表达式编译为对象, 在需要按该正则表达式匹配是可以在直接使用 该对象调用以上方法即可
使用过程中需要注意:
1.findall获取的是一个列表, 从列表中取出连接, 判断连接的完整性, 在进行请求
2.match和search获得的结果使用group进行取值, 要进行group取值, 需要进行判断或异常处理
import re
s = "python"
# findall方法演示
res_findall = re.findall(r‘p‘, s)
print(‘findall匹配结果:‘, res_findall)
# search方法演示, 不确定是否能匹配出结果, 不可直接使用group进行取值, 需要判断或进行异常处理
res_search = re.search(r"th", s)
if res_search:
print(res_search.group())
else:
print(‘None‘)
# match方法演示:
res_match_1 = re.match(r‘py‘, s)
res_match_2 = re.match(r‘thon‘, s)
print(res_match_1)
print(res_match_2)
# compile方法演示:
re_obj = re.compile(r‘python‘)
res = re.findall(re_obj,s)
print(res)
re 正则匹配
原文:https://www.cnblogs.com/huohai/p/12981730.html