正则表达式
概述
为什么要学习正则表达式
在实际开发过程中经常会有查找符合某些规则的字符串。
比如:邮箱、图片地址、手机号码等,想要匹配或者查找某些规则的字符串就可以使用正则表达式了。
正则表达式是什么
正则表达式(regular expression)描述了一种字符串匹配的模式,比如:
- 检索一个串是否含有某种子串(检索)
- 匹配的子串做替换(替换)
- 从一个串中取出符合某个条件的子串(提取)
**模式:**一种特定的字符串模式,这个模式是通过一些特殊的符号组成的。
正则表达式并不是Python特有的,在Java、PHP以及JavaScript等语言中都是支持正则表达式的。
正则表达式有哪些功能
功能
- 数据验证(表单验证,比如:手机号、邮箱、IP地址等)
- 数据检索(数据检索、数据抓取)=> 爬虫功能
- 数据隐藏(135****6235 号码隐藏)
- 数据过滤(论坛敏感词过滤)
- ...
re模块
re模块使用三步走
在python中需要通过正则表达式对字符串进行匹配时,可以使用re模块
# 第一步:导入re模块
import re
# 第二步:使用match方法进行匹配操作
result = re.match(pattern正则表达式,string要匹配的字符串,flags=0)
# flags:可选,表示匹配模式,比如忽略大小写,多行模式等
# 第三步:如果数据匹配成功,使用group方法来提取数据
result.group()
正则表达式常用的函数:
- 用来做校验的,替换的函数
match() -》从左到右,逐个字符的匹配,不会跳过某个字符,即:全词匹配
search() -》从左到右,依次匹配,即:只要某部分满足条件即可
compile().sub() -》替换
- 用来获取数据值的函数
group() -》获取匹配到的第一个数据
正则表达式编写
匹配单个字符
表达式 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[] | 匹配[]中列举的字符 |
[^指定字符] | 匹配除了指定字符以外的所有字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即空格、tab键 |
\S | 匹配非空白 |
\w | 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字 |
\W | 匹配特殊字符,即非字母、非数字、非汉字 |
python
import re
# 正则表达式匹配字符
print("正则表达式匹配字符")
result = re.match(r'.it', 'ait') # 能匹配,返回的是正则对象
print(result) # 输出匹配结果
print("正则表达式匹配字符2")
result3 = re.match(r'.it', 'aitb') # 能匹配,返回的是正则对象
print(result3) # 输出匹配结果
# 校验字符串是否包含ait,bit,cit,hit,git
print("\n校验字符串是否包含ait,bit,cit,hit,git")
result4 = re.match(r'[abchg]it', 'git')
print(result4) # 输出匹配结果
# 校验字符串第一个字符,可以是除了a,b,c外任意一个字符,后两个字符必须是hm
print("\n校验字符串第一个字符,可以是除了a,b,c外任意一个字符,后两个字符必须是hm")
result5 = re.match(r'[^abc]hm', ' dhm')
print(result5) # 输出匹配结果
# 匹配数字(\d)
print("\n匹配数字(\\d)")
result6 = re.match(r'\d', '1abc')
print(result6) # 输出匹配结果
# 匹配非数字(\D)
print("\n匹配非数字(\\D)")
result7 = re.match(r'\D', 'a123')
print(result7) # 输出匹配结果
# 匹配空白(\s)
print("\n匹配空白(\\s)")
result8 = re.match(r'\s', ' abc')
print(result8) # 输出匹配结果
# 匹配非空白(\S)
print("\n匹配非空白(\\S)")
result9 = re.match(r'\S', 'abc ')
print(result9) # 输出匹配结果
# 匹配非特殊字符(\w)
print("\n匹配非特殊字符(\\w)")
result10 = re.match(r'\w', 'a_1')
print(result10) # 输出匹配结果
# 匹配特殊字符(\W)
print("\n匹配特殊字符(\\W)")
result11 = re.match(r'\W', '@a_1')
print(result11) # 输出匹配结果
匹配多个字符
表达式 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
python
import re
# *:匹配前一个字符出现0次或者无限次,即可有可无
print("\n*:匹配前一个字符出现0次或者无限次,即可有可无")
result_star = re.match(r'a*', 'aaa') # 匹配 'a' 出现0次或多次
print(result_star) # 输出匹配结果
# +:匹配前一个字符出现1次或者无限次,即至少有1次
print("\n+:匹配前一个字符出现1次或者无限次,即至少有1次")
result_plus = re.match(r'a+', 'aaa') # 匹配 'a' 出现1次或多次
print(result_plus) # 输出匹配结果
# ?:匹配前一个字符出现1次或者0次,即要么有1次,要么没有
print("\n?:匹配前一个字符出现1次或者0次,即要么有1次,要么没有")
result_question = re.match(r'a?', 'a') # 匹配 'a' 出现0次或1次
print(result_question) # 输出匹配结果
result_question_none = re.match(r'a?', 'b') # 匹配 'a' 出现0次或1次
print(result_question_none) # 输出匹配结果
# {m}:匹配前一个字符出现m次
print("\n{m}:匹配前一个字符出现m次")
result_exact = re.match(r'a{3}', 'aaa') # 匹配 'a' 出现3次
print(result_exact) # 输出匹配结果
# {m,n}:匹配前一个字符出现m到n次
print("\n{m,n}:匹配前一个字符出现从m到n次")
result_range = re.match(r'a{2,4}', 'aaaa') # 匹配 'a' 出现2到4次
print(result_range) # 输出匹配结果
匹配开头和结尾
表达式 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
python
# ^:匹配字符串开头
print("\n^:匹配字符串开头")
result_start = re.match(r'^a', 'abc') # 匹配字符串以 'a' 开头
print(result_start) # 输出匹配结果
# $:匹配字符串结尾
print("\n$:匹配字符串结尾")
result_end = re.match(r'b$', 'ab') # 匹配字符串以 'b' 结尾
print(result_end) # 输出匹配结果
提取分组数据
表达式 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
python
import re
print("\n|:匹配左右任意一个表达式")
result_or = re.match(r'a|b', 'a') # 匹配 'a' 或 'b'
print(result_or) # 输出匹配结果
print("\n(ab):将括号中字符作为一个分组")
result_group = re.match(r'(ab)', 'ab') # 将 'ab' 作为一个分组
print(result_group.group(0)) # 输出匹配结果
print("\n\\num:引用分组num匹配到的字符串")
result_ref = re.match(r'(ab)\1', 'abab') # 引用分组1匹配到的字符串
print(result_ref) # 输出匹配结果
扩展补充
#####正则的三种匹配方式
- match匹配方式
语法格式:re.match(pattern, string, flags)
参数:
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位(暂时忽略)
功能:尝试从字符串起始位置匹配一个正则表达式
1)如果不能从起始位置匹配成功,则返回None;
2)如果能从起始位置匹配成功,则返回一个匹配的对象 - search匹配方式
语法格式:re.search(pattern, string, flags)
参数:
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位(暂时忽略)
功能:根据正则表达式扫描整个字符串,并返回第一个成功的匹配
1)如果不能匹配成功,则返回None;
2)如果能匹配成功,则返回一个匹配对象
3.findall匹配方式
语法格式:re.findall(pattern, string, flags)
参数:
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位(暂时忽略,后面会介绍)
功能:根据正则表达式扫描整个字符串,并返回所有能成功匹配的子串
1)如果不能匹配成功,则返回一个空列表;
2)如果能匹配成功,则返回包含所有匹配子串的列表
贪婪模式和非贪婪模式
贪婪模式
在整个表达式匹配成功的前提下,尽可能多的匹配
非贪婪模式
在整个表达式匹配成功的前提下,尽可能少的匹配
正则中的量词:和+,默认都是贪婪模式的匹配,可以在他们后面加?将其变为非贪婪模式。
常用贪婪模式如: .常用非贪婪模式如: .*?
正则标志修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式
修饰符被指定为一个可选的标志,多个标志可以通过按位 OR(|) 它们来指定。
修饰符 描述
re.I 匹配时不区分大小写
re.S 使 . 匹配包括换行符\n在内的所有字符