正则表达式
一、正则表达式语法
1.普通字符
英文半角字符,匹配时只匹配与自身相同的一个字符
2.元字符
元字符:表示一些特殊的含义,一般不是指具体字符
表达式 | 匹配 |
---|---|
. | 匹配除换行符\n 以外的任意一个字符 |
| | 逻辑或操作符 |
[] | 匹配字符集中的一个字符 |
[^] | 对字符集求反,尖号必须在方括号里的最前面 |
- | 定义[] 里的一个字符区间,例如[a-z] |
\ | 对紧跟其后的一个字符进行转义 |
() | 对表达式进行分组,将圆括号内的内容当做一个整体,并获得匹配的值 |
3.转义字符
转义字符:具有特殊功能的字符
表达式 | 匹配 |
---|---|
\r , \n | 匹配回车和换行符 |
\t | 匹配制表符 |
\\ | 匹配斜杠\ |
\^ | 匹配^ 符号 |
\. | 匹配小数点. |
4.预定义匹配字符集
表达式 | 匹配 | 对等字符 |
---|---|---|
\d | 匹配任意一个数字 | [0-9] |
\D | \d 的反集,即非数字的任意一个字符 | [^\d] |
\w | 匹配任意一个字母或数字或下划线 | [a-zA-Z0-9_] |
\W | \w 的反集 | [^\w] |
\s | 匹配空格、制表符、换页符等空白字符的其中任意一个 | [\t\n\x0B\f\r] |
\S | \s 的反集 | [^\s] |
5.重复匹配
表达式 | 匹配 |
---|---|
{n} | 表达式重复n次 |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
? | 匹配表达式0次或者1次,相当于{0,1} |
+ | 表达式至少出现1次,相当于{1,} |
* | 表达式出现0次到任意次,相当于{0,} |
6.位置匹配
表达式 | 匹配 |
---|---|
^ | 在字符串开始的地方匹配,符号本身不匹配任何字符 |
$ | 在字符串结束的地方匹配,符号本身不匹配任何字符 |
\b | 匹配一个单词边界,也就是单词和空格之间的位置,符号本身不匹配任何字符 |
\B | 匹配非单词边界,即左右两边都是\w 范围或者左右两边都不是\w 范围时的字符缝隙 |
7.贪婪与非贪婪模式
贪婪模式:.*
非贪婪模式:.*?
8.常用正则
功能 | 表达式 |
---|---|
匹配中文字符 | [\u4e00-\u9fa5] |
英文和数字 | [A-Za-z0-9]+$ |
匹配网址 | [a-zA-z]+://[^\s]* |
日期格式 | \d{4}-\d{1,2}-\d{1,2} |
QQ 号 | [1-9][0-9]{4,} |
二、re模块
1.修饰符(flag)
flag | 描述 |
---|---|
re.S | 使 . 这个通配符能够匹配包括换行在内的所有字符,针对多行匹配 |
re.I | 使匹配对大小写不敏感 |
re.A | ASCII字符模式 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |
2.match()
match(pattern, string, flags=0)
pattern:正则表达式
string:要匹配的字符串
flags:修饰符
在给定字符串的开头(必须从开头开始)进行匹配,如果匹配不成功则返回None,匹配成功返回一个匹配对象, 忽略后面,直接返回不再查找 ,这个对象有个group()方法,可以将匹配到的字符串给出
import re
s = 'Hello world 123 456 world'
res1 = re.match('w.*?d', s)
print(res1) # None
res2 = re.match('He.*?o', s)
print(res2) # <re.Match object; span=(0, 5), match='Hello'>
print(res2.group()) # Hello
print(res2.span()) # (0, 5)
print(res2.start()) # 0
print(res2.end()) # 5
3.search()
search(pattern, string, flags=0)
在文本内查找,返回第一个匹配到的字符串,它的返回值类型和使用方法与match()是一样的,唯一的区别就是查找的位置不用固定在文本的开头
import re
s = 'Hello world 123 456 world'
res = re.search('w.*?d', s)
print(res) # <re.Match object; span=(6, 11), match='world'>
print(res.group()) # world
print(res.span()) # (6, 11)
print(res.start()) # 6
print(res.end()) # 11
4.findall()
findall(pattern, string, flags=0)
全文查找,它的返回值是一个匹配到的字符串的列表,没有group()方法,没有start、end、span,更不是一个匹配对象,如果一项都没有匹配到那么返回一个空列表
import re
s = 'Hello world 123 456 world'
res = re.findall('w.*?d', s)
print(res) # ['world', 'world']
print(res[0]) # world
5.sub()
sub(pattern, repl, string, count=0, flags=0)
pattern:想要替换的字符串
repl:替换成的字符串
string:要匹配的字符串
count:替换的次数
flags:修饰符
类似字符串的replace()方法,用指定的内容替换匹配到的字符,可以指定替换次数
import re
s = "i am jack!i like swiming!"
res = re.sub(r"i", "I", s, 2)
print(res) # I am jack!I like swiming!
高级功能——“分组引用”
import re
s = "Hello,world!"
res = re.sub(r"(world)", r"<em>\1<em>", s) # 注意括号和\1的作用!
print(res) # Hello,<em>world<em>!
6.compile()
compile(pattern, flags=0)
re模块的工厂方法,用于将字符串形式的正则表达式编译为Pattern模式对象,可以实现更高效率的匹配
import re
s1 = "2019-6-6 12:00"
s2 = "2019-6-7 21:12"
pattern = re.compile('\d{2}:\d{2}')
res1 = re.sub(pattern, '', s1)
res2 = re.sub(pattern, '', s2)
print(res1,res2) # 2019-6-6 2019-6-7
7.split()
split(pattern, string, maxsplit=0, flags=0)
pattern:被去除的部分的正则表达式
string:要匹配的字符串
maxsplit:分割的次数
re模块的split()方法和字符串的split()方法很相似,都是利用特定的字符去分割字符串