正则表达式
没有激流就称不上勇进,没有山峰则谈不上攀登。–佚名
正则表达式
正则表达式自己有一套规则,他可以通过一些规则来筛选出正确的结果
学到很多东西的诀窍,就是一下子不要学很多。——洛克
流程概述
(1) 创建正则表达式对象
- 使用正则表达式之前,必须借助 re 模块,否则在 Python 中使用不了正则表达式
import re
(2) 匹配 Regex 对象
- 必须使用 compile(r’规则’) 设定规则
import re
regex = re.compile(r"Python")
(3)通过规则来找到结果
- 必须使用 search()
import re
str = "今天我开始学习Python222222222"
regex = re.compile(r"Python")
match = regex.search(str)
# 结果
# 找不到的话就是None
# 找的到的话就是类型就是 <class 're.Match'>
(4) 找到结果的时候通过 group()来输出结果
- group() 来输出结果
str = "今天我开始学习Python222222222"
regex = re.compile(r"Python")
match = regex.search(str)
result = match.group()
print(result)
完整版
import re
str = "今天我开始学习Python222222222"
regex = re.compile("Python")
match = regex.search(str)
print(match) # 找不到就是None
if match:
result = match.group()
print(result)
else:
print("没有筛选到")
总结
使用 import re 引入正则模块
使用 re.compile() 设定规则
向 Regex 对象的 search()方法传入想要找的字符串,它返回一个 Match 对象
调用 Match 对象的 group()方法 返回实际匹配文本的字符串
用正则表达式匹配更多模式
利用括号分组
- 举例子 \d 表示查找数字 加了括号他的顺序就是从 1 开始
import re
str = 'My number is 415-555-4242'
regex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
match = regex.search(str)
result0 = match.group(0)
result1 = match.group(1)
result2 = match.group(2)
print(result0)
print(result1)
print(result2)
# 结果
# 415-555-4242
# 415
# 555-4242
用管道匹配多个分组
字符 | 称为 管道 希望匹配许多表达式中的一个时 就可以用它
- 他是条件满足一个就行,谁写在前面就满足谁
import re
str = 'Black and White'
regex = re.compile(r'Black|White')
match = regex.search(str)
result = match.group()
result2 = match.group(2)
print(result)
print(result2)
# 结果就是Black
# 要是把White 写在前面的话
# 结果就是White
用问号可以实现选配
- 用问号可以实现选配 就是无论满足不满足 正则都会认为满足
import re
str = 'Blackwoman'
str2 = 'Blackman'
def reg(str):
regex = re.compile(r'Black(wo)?man')
match = regex.search(str)
result = match.group()
print(result)
reg(str)
reg(str2)
# 结果
# Blackwoman
# Blackman
用星号匹配零次或者多次(找不到也没关系)
import re
str = 'Blackman'
str2 = 'Blackwowowowowoman'
def reg(str):
regex = re.compile(r'Black(wo)*man')
match = regex.search(str)
result = match.group()
print(result)
reg(str)
reg(str2)
# 结果
# Blackman
# Blackwowowowowoman
用加号匹配 1 次或者多次
import re
str = 'Blackman'
str2 = 'Blackwowowowowoman'
def reg(str):
regex = re.compile(r'Black(wo)+man')
match = regex.search(str)
if match:
result = match.group()
print(result)
else:
print("没有结果")
reg(str)
reg(str2)
# 结果
# 没有结果
# Blackwowowowowoman
用花括号匹配特定的次数
如果一个分组想要重复特定的次数,就在正则表达式中该分组的后面,跟上花括号包围的数字例如(Ha){3} 就表示 HaHaHa 但是它不会匹配’HaHa’
除了一个数字,还可以指定一个范围,即在花括号中写下一个最小值,一个逗号和一个最大值,例如(Ha){1,3} 它就会匹配 ‘Ha’, ‘HaHa’,’HaHaHa’
import re
str = 'Ha'
str2 = 'HaHaHa'
str3 = 'HaHaHaHaHa'
def reg(str):
regex = re.compile(r'(Ha){1,5}')
match = regex.search(str)
if match:
result = match.group()
print(result)
else:
print("没有结果")
reg(str)
reg(str2)
reg(str3)
# 结果
# Ha
# HaHaHa
# HaHaHaHaHa
贪心和非贪心模式
- 在 Python 中正则表达式默认是贪心的,也就是他会找出来最多的比如(Ha){3,5} 他会找出了符合最长的而不是最短的
import re
str3 = 'HaHaHaHaHa'
def reg(str):
regex = re.compile(r'(Ha){1,5}')
match = regex.search(str)
if match:
result = match.group()
print(result)
else:
print("没有结果")
reg(str3)
# 结果
# HaHaHaHaHa
- 如果你不想进贪心模式,你就想找到最短的,只有?来解决
import re
str3 = 'HaHaHaHaHa'
def reg(str):
regex = re.compile(r'(Ha){1,5}?')
match = regex.search(str)
if match:
result = match.group()
print(result)
else:
print("没有结果")
reg(str3)
# 结果
# Ha
所以在 Python 正则表达式中,问号有两种含义 生命表示可选的分组 或者 声明非贪心模式
findall() 方法
除了 search()方法还有一个 findall()方法.search()返回的是一个 Match()对象,而 findall()返回的是一组字符串,包含被查找字符串中的所有匹配
findall 就三步 没有 group,结果是个数组
import re
str3 = 'HaHaHaHaHa'
def reg(str):
regex = re.compile(r'(Ha){1,5}?')
match = regex.findall(str)
print(match)
reg(str3)
# 结果
# ['Ha', 'Ha', 'Ha', 'Ha', 'Ha']
规则分类
\d 0到9的数字
\D 除0到9的数字以外的任何字符
\w 任何字母,数字,下划线
\W 除任何字母,数字,下划线以外的任何字符
\s 空格 制表符 换行符(可以认为匹配空白字符)
\S 除空格 制表符 或换行符以外的任意字符
> 大写就表示取反
插入字符和美元字符
^ 表示以什么开头的
$ 表示以什么结尾的
import re
str3 = '12121212121'
def reg(str):
regex = re.compile(r'^\d+$')
match = regex.search(str)
result = match.group()
print(result)
reg(str3)
# 结果
# 12121212121
通配字符
python 中 (.)句号 代表通配符,它匹配除了换行之外的所有字符
要是匹配真正的.前面需要加转义\
import re
str3 = 'Hellodada'
def reg(str):
regex = re.compile(r'.d')
match = regex.findall(str)
print(match)
reg(str3)
# 结果
# ['od','ad']
用点-星匹配所有字符
- 有的时候匹配所有字符(.*) 表示任意文本
import re
str3 = 'Hello dada'
def reg(str):
regex = re.compile(r'(.*) (.*)')
match = regex.findall(str)
print(match)
reg(str3)
# 结果
# [('Hello', 'dada')]
- re.DOTALL 匹配所有字符,包括换行符,全部匹配
import re
str3 = 'Server the public trust .\nprotect the woman .\nUpload the law'
def reg(str):
regex = re.compile('.*', re.DOTALL)
match = regex.findall(str)
print(match)
reg(str3)
# 结果
# 'Server the public trust .\nprotect the woman .\nUpload the law'
替换 sub()
import re
str3 = 'Server the public woman'
def reg(str):
regex = re.compile('woman', re.DOTALL)
result = regex.sub('女人', str3)
print(result)
reg(str3)
# 结果
# Server the public 女人
忽略字符串中的空白符和注释
r 后面必须有 3 个引号 结尾也必须 3 个引号
传入第二个参数 re.VERBOSE
import re
str3 = 'Server the public woman'
def reg(str):
regex = re.compile(r'''(woman)#忽略注释''', re.VERBOSE)
match = regex.search(str3)
result = match.group()
print(result)
reg(str3)
# 结果
# woman
组合版本
import re
str3 = 'Server the public woman'
def reg(str):
regex = re.compile(r'''(woman)#忽略注释''', re.VERBOSE|re.DOTALL)
match = regex.search(str3)
result = match.group()
print(result)
reg(str3)
# 结果
# woman