正则表达式作用:
通过写正则表达式来描述字符串规则
re模块中的函数 | 作用 | |
---|---|---|
fullmatch(正则表达式, 字符串) | 判断整个字符串是否满足正则表达式所描述的规则 | 匹配失败结果都为None |
findall(正则表达式, 字符串) | 提取字符串中所有满足正则表达式的字符串 | |
search(正则表达式, 字符串) | 匹配字符串中第一个满足正则表达式的字符串 | |
match(正则, 字符串) | 匹配字符串开头 | |
finditer(正则, 字符串) | 获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象 | |
splite(正则, 字符串, N) | 将字符串中前N个满足正则的子串作为切割点进行切割 | |
sub(正则, 字符串1, 字符串2) | 将字符串2中所有满足正则的子串都替换成字符串1 |
注意:python中表达一个正则表达式一般使用r字符串
1.re模块 - 提供了python中所有和正则相关的函数
2.正则符号
正则符号 | 作用 |
---|---|
普通符号 | 在正则表达式中表示符号本身 |
. | 表示匹配任意一个字符 |
\d | 匹配任意一个数字字符 |
\s | 匹配任意一个空白字符 |
\w | 匹配任意一个字母、数字、下划线或者中文 |
\D、\S、\W | 与小写的\d \s \w意义相反 |
[abc] | 匹配a或者b或者c |
[abc\d] | 匹配a或者b或者c或者任意数字 |
[1-5] | 匹配1-5字符中的任意一个字符 |
[a-z] | 匹配任意一个小写字母 |
[A-Z] | 匹配任意一个大写字母 |
[a-zA-Z] | 匹配任意一个字母 |
[a-z=%] | 匹配任意一个小写字母或者=或者% |
[\u4e00-\u9fa5] | 匹配任意一个中文 |
[^字符集] | 匹配不在字符集中的任意一个字符 |
\s补充: | 空白字符:空格(’ ‘)、换行(’\n’)、水平制表符(‘\t’) |
# 普通字符
result = fullmatch(r'abc', 'xbc')
print(result) # None
# . 匹配任意一个字符
result = fullmatch(r'.bc', ',bc')
print(result) # 返回正则对象
# \d
result = fullmatch(r'\d\dabc', '89abc')
print(result)
# \s
result = fullmatch(r'123\sabc', '123\tabc')
print(result)
正则匹配次数符号 | 作用 |
---|---|
* | 任意次数(0次或者1次或者次数) |
+ | 一次或者多次(至少1次) |
? | 0次或者1次 |
{} | {N}、{M,N}、{M,}、{,N} |
{N} | N次 |
{M,N} | M到N次 |
{M,} | 最少M次 |
{,N} | 最多N次 |
# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。
# 合法:233、+234、-7283、100、-2000
# 不合法:0、0002、2.23
result = fullmatch(r'[+-]?[1-9]\d*', '0123')
print(result)
贪婪和非贪婪模式
# 在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个凑数,非贪婪取最少的那个次数
"""
贪婪模式:+ 、?、 *、{M,N}、{,N}、{M,}
非贪婪模式:+? 、??、 *?、{M,N}?、{,N}?、{M,}?
"""
分组和分支
1)分组 - ()
# 正则表达式中可以用()将部分内容括起来表示一个整体;括号括起来的部分就是一个分组
a.整体操作的时候需要分组
# '23M23' '89K10L' '09H23P90Q33W'
result = fullmatch(r'(\d\d[A-Z])+', '09H23P90Q33W')
print(result)
b.重复匹配 - 正则中可以通过\M来重复它前面第M个分组匹配的结果
# '23M23' '90K90' '78N78'
result = fullmatch(r'(\d\d)[A-Z]\1', '78N78')
print(result)
c.捕获 - 提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
# 匹配对象.group(N) - 获取匹配结果中指定分组匹配到的内容
# 提取身高
message = '我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\d+)厘米, 体重(\d+)kg', message)
print(result) # <re.Match object; span=(11, 25), match='身高180厘米,体重70kg'>
print(result.group()) # '身高180厘米,体重70kg'
print(result.group(1), result.group(2)) # 180 70
2)分支 - |
正则1|正则2|正则3|… - 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配
result = fullmatch(r'abc\d\d'|'abc[A-Z]{2}', 'abc123')
print(result)
result = fullmatch(r'abc(\d\d|[A-Z]{2})', 'abcKS')
print(result)
转义符号
定义:在本身具有特殊功能或者特殊意义的符号前加 \ ,让特殊符号变普通符号
# 去掉()原本的分组功能
# (amd)
result = fullmatch(r'\([a-z]{3}\)', '(amd)'
print(result)
result = fullmatch(r'\d\d\.\d\d', '23.45')
print(result)
# 两位数相加之和
result = fullmatch(r'\d\+\d', '3+4')
print(eval(result.group()))
# 注意:单独存在有特殊意义的符号,在[]中它的功能会自动消失
例子:获取豆瓣top前250的电影名字
import requests from re import findall headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' } response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers) # print(response.text) result = findall(r'<img width="100" alt="(.+?)"', response.text) # +?非贪婪模式 print(result)
练习: 使用正则提取top250中每个电影的详情页地址
from re import findall import requests headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36' } resp = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers) result = findall(r' <a href=("https://movie.douban.com/subject/\d+/")>', resp.text) print(result)
re模块
from re import fullmatch, findall, search, split, sub, finditer, match
"""
1)fullmatch(正则, 字符串) - 用整个字符串和正则,匹配成功返回匹配对象,匹配失败返回None
2)findall(正则, 字符串) - 获取字符串中所有满足正则的子串,默认返回一个列表,列表中的元素是所有匹配到的子串(存在自动捕获现象)
3)search(正则, 字符串) - 匹配第一个满足正则的子串,匹配成功返回匹配对象,匹配失败返回None
4)split(正则, 字符串) - 将字符串中所有满足正则的子串作为切割点进行切割
5)split(正则, 字符串, N) - 将字符串中前N个满足正则的子串作为切割点进行切割
6)sub(正则, 字符串1, 字符串2) - 将字符串2中所有满足正则的子串都替换成字符串1
7)sub(正则, 字符串1, 字符串2, N)
8)finditer(正则, 字符串) - 获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象
9)match(正则, 字符串) - 匹配字符串开头
"""
1)忽略大小写 - (?i)
print(fullmatch(r'(?i)abc', 'abc'))
print(fullmatch(r'(?i)abc', 'Abc'))
print(fullmatch(r'(?i)abc', 'ABc'))
print(fullmatch(r'(?i)abc', 'aBc'))
2)单行匹配 - (?s)
# 多行匹配(默认):. 不能和换行符进行匹配
# 单行匹配:. 可以和换行符进行匹配
print(fullmatch(r'abc.123', 'abc\n123')) # None
print(fullmatch(r'(?s)abc.123', 'abc\n123')) # <re.Match object; span=(0, 7), match='abc\n123'>
msg = """
'name:"jshf2-
2ss技术"'
"""
result = findall(r'(?s)name:"(.+)"', msg)
print(result)