re 模块
基本
- re.match() :
从字符串开头进行匹配,如果字符串开头就不符合,返回 None
- re.search() :
返回字符串中匹配的第一个结果,没有就返回 None
- re.findall() :
返回字符串中所有符合的结果,没有就返回空列表[]
共同参数:
* **pattern : 正则表达式** * **string : 匹配的字符串** * **flags: 控制正则表达式匹配方式 ( <code>默认为0</code> )**
- re.I : 让正则匹配
不区分
大小写
- re.M : 让^和$支持多行匹配
- re.S : 让 . 支持多行匹配
- re.X 忽略表达式中的空白和注释,可以用#来写注释
- 可以写为 re.M | re.S 来匹配多种规则
方法
group(number) : 返回匹配的字符串。
re.compile(): 生成一个正则表达式,可以直接.属性进行匹配
re.sub: 通过正则匹配字符串后
替换
字符串内容
- sub(pattern, repl, string, count=0, flags=0):
- pattern : 正则表达式
- repl : 匹配后替换的内容 (可以是一个函数,函数需要返回处理后的文本)
- string : 待匹配文本
- count : 匹配次数
- flags : 表达式匹配方式
- re.subn(): 通过正则匹配字符串后替换字符串内容,返回一个元组
re.split : 通过匹配的正则表达式切割字符串
- pattern, string, maxsplit=0, flags=0
- pattern: 正则表达式
- string: 待匹配文本
- maxsplit: 最大切割次数
- flags : 控制正则匹配方式
重点
正则通配符
^
: 匹配字符串开始位置 (需要写在正则前面)$
: 匹配字符串结束位置 (需要写在正则后面)\d
: 匹配数字 0-9\X
: 包含换行符在内的 unicode 字符\w
: 匹配 字母 数字 下划线\s
: 匹配空白字符\b
: 匹配边界
- 边界可以这么理解:
- 正则 :”ab\b”
- 可以匹配到 cmab 中的 ab
- 不能匹配到 cabd 中的 ab
- tips:
记到这个就够了,只要记住小写是匹配什么,大写就是匹配相反的内容
.
: 匹配任意内容(除了换行,可以通过标志位来开启匹配换行)+
: 跟在表达式后面,表示表达式必须匹配一次以上*
: 跟在表达式后面,表示表达式匹配任意次数?
: 当?存在于+ *等贪婪通配符后面时,表示非贪婪模式(尽可能匹配少的内容)
- . 默认是开启贪婪模式,匹配除了换行在内的所有内容
- 字符串 : aaaaaa
- 正则表达式 :
a{2,6}
(贪婪模式
)会直接匹配到六个 a- 正则表达式 :
a{2,6}?
(非贪婪模式
)会匹配到[‘aa’, ‘aa’, ‘aa’]?
: 当?在除贪婪表达式外时,表示前面的内容可有可无
[..]
: 匹配中括号内指定内容[0-9A-Z]
: 匹配数字,及大写英文[^..]
: 当^存在于中括号内时,表示匹配除了
中括号内的所有其他内容[^0-9a-z]
: 匹配除了数字,及大写英文外的内容a{3}
: 匹配指定次数, 前面正则表达式只会匹配 aaa,不会匹配 aa。a{5,}
: 前面表示必须匹配五次 a 以上|
: 匹配 | 左边或者右边的正则()
: 记录匹配的内容,并分成一个组,可以配合\number 达到特殊效果(?: )
: 只匹配内容,不会在内存中记录分组信息。( 丢弃匹配 )
- 当你用
\1
这种方式的时候 就不会匹配到丢弃匹配的组(?imx:A)
: 前面括号内的正则表达式会开启
imx 匹配方式()(?-imx:A)
: 前面括号内的正则表达式会关闭
imx 匹配方式()当需要匹配正则表达式中通配符时候使用
\进行转义 \? 即可匹配问号
分组实例
分组实例
- 现在有这个字符串 : <h1>我爱北京<h1> <h1>我爱北京<h2>
- 通常在匹配网页或者
成对出现
的内容的时候使用- 我想匹配开头和结尾是一样的就可以这样写表达式
- (<\w+>)我爱北京(\1)
- \1 表示匹配前面\w+匹配到的内容,所以不会匹配到后面那个前后不一致的内容
分组实例
- 通过 group 提取出指定正则表达式的内容
# 以下文本进行匹配 text = "123aaa" # 通过(?P<ReName>正则)进行分组 # 前面的?P<name>:为固定写法,后面用group进行提取的时候,将名字传递进去 # 即可拿到后面正则表达式提取到的值 print(search(r'(?P<ReName>\d+)', text).group('ReName')) # 输出为:123
断言实例 ( 预搜索 )
- 如果我们希望正在写的词语出现在另一个词语之前或之后,我们需要使用「零宽断言」。
正向先行断言 (?=正则)
(?=正则)
: 直接讲不容易懂,直接上实例
\d(?=PM)
这个断言\d
是数字 那么就是匹配\d
后面跟着必须是PM
- 比如 匹配
5PM
9PM
不会匹配1PP
注意这里匹配到的是 前面的数字 而后面的
PM
是不会被匹配的反向先行断言 (?!正则)
- 这个就和上面相反 上面是匹配 这里是不匹配
- \d(?!PM) 这个断言匹配的就是 数字后面跟着的不是
PM
的6PP
可以被匹配到6PM
匹配不到- 注意这里匹配到的是前面的
6
后面的PP
是匹配不到的
正向后行断言(?<=正则)
- 匹配某正则
前面
是否符合正则(?<=\$)\d
- 上面的正则会匹配到
$5
也就是一个数字前面 必须跟着的是$
符号 其中\
代表转义- 而不会匹配到
&5
@2
等情况- 注意这里匹配到的是
数字
5
而不是$5
反向后行断言(?<!正则)
- 匹配正则前面是否符合正则
(?<!\$)\d
- 这个和就是匹配 数字
\d
之前 不是$
符号的情况- 也就是会匹配到
#2
&1
但是不会匹配到$5
- 注意这里匹配到的是
2
和1
不是#2
&1