正则表达式
1.什么是正则?
是编程语言,用于匹配字符串,没有唯一标准答案,能匹配到即可
是通用语言,在python中通过re模块来实现
2.正则在线工具
正则表达式速查表
https://www.jb51.net/shouce/jquery1.82/regexp.html
在线正则表达式测试
https://tool.oschina.net/regex
3.字符匹配
普通字符
大部分字符与自身完全匹配,例如表达式good与字符串'good'完全匹配
元字符(重要,常用)
常用元字符 | 解释 |
---|---|
. | 匹配单个字符 |
+ | 匹配前一个字符1次或多次 |
? | 匹配前一个字符0次或1次 |
* | 匹配前面所有字符0次或多次 |
- | 区间,匹配区间内字符或数字 |
[] | 匹配方括号内任意字符,[a-zA-Z0-9]除此之外,还可以匹配不在区间范围内的字符^5 |
^ | 匹配起始位置 |
$ | 匹配字符串结束 |
将元字符转义成普通字符 ^ [] | |
{} | 重复次数 |
| | 表示或 |
() | 分组,看成一个整体 |
d | 匹配一个数字字符,等价于[0-9] |
D | 匹配一个非数字字符,等价于[^0-9] |
s | 匹配任意空白字符,包括空格,制表符,换页符,等价于[f v] |
S | 匹配任意非空字符,等价于[^f v] |
w | 匹配包括下划线的任何单词字符,等价于[a-zA-Z0-9_] |
W | 匹配任何非单词字符,等价于[^a-zA-Z0-9] |
正则练习
1.匹配字符串中的数字one1two2three3
答案:d
2.字符串a{4} 结果什么
答案:a4次
3.正则:c|d 匹配字符串abcd 结果是什么
答案:c或者d
4.正则:(ab) 匹配字符串 abd adc abb 结果是什么
答案:ab ab
5.字符串 ['AD123456','ac123456','AB12345'] 正则匹配2个大写字母+6个数字
[A-Z]{2}[0-9]{6}
4.python中正则相关函数
函数 | 说明 |
---|---|
compile(pattern) | 创建正则表达式的规则对象 |
match(pattern,string) | 用正则表达式匹配字符串,成功返回匹配对象,否则返回None |
search(pattern,string) | 搜索字符串中第一次出现正则表达式的模式,成功返回匹配对象,否则返回None |
split(pattern,string,maxsplit=0) | 用正则表达式指定的模式分隔符拆分字符串,返回列表 |
sub(pattern,repl,string) | 用指定的字符串替换原字符串中与正则表达式匹配的模式,可以用count指定替换的次数 |
fullmatch(pattern,string) | match函数的完全匹配,从字符串开头到结尾 |
findall(pattern,string) | 查找字符串所有与正则表达式匹配的模式,返回字符串的列表 |
import re
print('match 从起始开始匹配')
print(re.match('www', 'www.com'))
# 返回一个对象 <re.Match object; span=(0, 3), match='www'>
print(re.match('www', 'www.com').group())
# 需要group转化一下, 返回 www
print(re.match('www', 'com.www'))
# 起始位置没有www,不匹配返回 None
print('search 只返回第一个匹配的')
print(re.search('www', 'http://www').group())
# 返回www
print(re.search('www', 'http://www.com.www').group())
# 返回www
print('findall,从左到右,按顺序返回匹配列表,无匹配返回空列表')
print(re.findall('d', 'one1two2three3'))
# 返回 ['1','2','3']
print(re.findall('d', 'onetwothree'))
# 返回 []
print(re.findall('four', 'onefourtwofour'))
# 返回 ['four','four']
print('sub 替换')
print(re.sub('g..t', 'zhangsan', 'grrt 1gbbt2 gc3ct', ))
# 找到有gt的进行替换,且中间只有两个单字符 返回 zhangsan 1zhangsan2 gc3ct
print('split 切割')
print(re.split('+', '123+456*789'))
# 按照+号进行切割 进行转义 返回 ['123','456*789']
print('compile 创建匹配规则对象')
# compile 先进行了编译速度会更快一些
pattern = re.compile('[a-zA-Z]')
# 先创建匹配对象
result = pattern.findall('a1Bc_Z2yW')
# 再进行正则匹配 也可以直接用findall
print(result)
# 返回 ['a', 'B', 'c', 'Z', 'y', 'W']
5.贪婪匹配和非贪婪匹配
test遇到以下两种正则,结果是什么
<.*>
贪婪从'<'开始到'>'结束,拿取所有的字符
答案:<div><span>test</div></span>
<.*?>
非贪婪从'<'开始到'>'结束,'?'匹配前一个字符1次或者0次;一次一次的匹配
答案:<div>
<span>
</div>
</span>