正则表达式
正则表达式又称为规则表达式.正则表达式通常用于检索、替换那些符合那些符合摸个规则的文本。
作用:
- 测试字符串的某个模式,即数据有效性验证
- 实现按照某种规则替换文本
- 根据模式匹配从字符串中提取一个子字符串
构成:
- 原子(普通字符,如英文字母)
- 元字符(有特殊功能的字符)
- 模式修正字符
匹配单字符
字符 | 匹配范围 |
---|---|
. | 匹配任意1个字符(除了\n) |
[] | 匹配[]中列举的字符 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白,即空格,\t-Tab键,\n换行 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_ |
\W | 匹配非单词字符 |
匹配多个字符
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或多次,即可有可无 |
+ | 匹配前一个字符出现1次或多次,即至少出现一次 |
? | 匹配前一个字符出现0次或1次,即要么出现一次要么不出现 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现m到n次 |
匹配开头结尾
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
注意:当^在[]中时表示取反:[^h]匹配不是h的字符
匹配分组
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中的字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
re模块
match匹配
re.match(pattern,string,flags=0)
:
从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未成功返回None
- pattern:正则模型
- string:要匹配的字符串
- faigs:匹配模式
match()方法一旦匹配成功,就是一个match object对象,有以下方法:
- group():返回被re匹配的字符串
- start():返回匹配开始的位置
- end():返回匹配结束的位置
- span():返回一个元组包含匹配(开始,结束)的位置
示例:
"""
1 导入模块
2. 通过match验证正则
3. 判断验证是否正确
4. 如果成功获取匹配结果
"""
# 1 导入模块
import re
str1 = 'hahazhong@qq.com'
# 2. 通过match验证正则
result = re.match('\w*@qq\.com', str1)
print(result)
# 3. 判断验证是否正确
# 4. 如果成功获取匹配结果
if result:
print('匹配成功')
print('匹配结果:', result.group())
else:
print('匹配失败')
search搜索匹配
re.search(pattern,string,flags=0)
:
从需要检测的字符串中搜索一个符合规则的字符串,搜索成功返回一个对象,未成功返回None,其余和match()相同
match()和search()区别:match()只检测RE是否在string的开始位置匹配,search()会扫描整个string查找匹配
findall查找所有
re.findall(pattern,string,flags=0)
:
遍历匹配字符串中所有匹配的字符串,返回一个列表
如果匹配的正则里含有分组,则会返回分组内容打包的元组列表
sub替换
re.sub(pattern,newstring,string)
:
- newstring:替换的字符串
使用re替换string中每一个匹配的子串返回替换后的字符串。
split分割
re.split(pattern,newstring,string)
:
按照正则拆分字符串,返回值为一个列表。
贪婪和非贪婪
Python中数量词是贪婪的(少数语言为非贪婪),总是尽可能多的字符;非贪婪则相反,总是尽可能匹配少的字符。
在.
、?
、+
、{m,n}
后加上?,使贪婪变成非贪婪。
模式修正符:
re.S:使正则表达式中的.匹配到换行符
re.I:使正则表达式中忽略大小写