re 模块
基本
- re.match() :
从字符串开头进行匹配,如果字符串开头就不符合,返回 None
- re.search() :
返回字符串中匹配的第一个结果,没有就返回 None
- re.findall() :
返回字符串中所有符合的结果,没有就返回空列表[]
共同参数:
* **pattern : 正则表达式** * **string : 匹配的字符串** * **flags: 控制正则表达式匹配方式 ( <code>默认为0</code> )** * **re.I : 让正则匹配<code>不区分</code>大小写** * **re.M : 让^和$支持多行匹配** * **re.S : 让 . 支持多行匹配** * **re.X 忽略表达式中的空白和注释,可以用#来写注释**
方法
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 达到特殊效果(?: )
: 只匹配内容,不会在内存中记录分组信息。( 丢弃匹配 )(?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
断言实例 ( 预搜索 )
- 以下内容都使用字符串
- 字符串:
我喜欢你,我喜欢猪头,我喜欢钱,我喜欢妹子,我喜欢黑丝
- 当你想用正则定位一个内容,然后又不想用 group 进行取值的时候就也可以用断言,出来的结果就是你想要的内容
正向先行断言 (?=正则)
(?=正则)
: 直接讲不容易懂,直接上实例
- 我需要匹配我喜欢,并且喜欢的后面必须是黑丝
- 正则表达式 :
我喜欢(?=黑丝)
- 上面中正则表达式指定我喜欢后面必须是跟着黑丝
- 注意这里黑丝并没有被消耗,如果表达式改成
我喜欢(?=黑丝).{2}
- 那么就会匹配到
我喜欢黑丝
其实我不喜欢反向先行断言 (?!正则)
- 反向先行断言和正向先行断言
完全相反
- 正则表达式 :
我喜欢(?!黑丝)
- 匹配所有我喜欢后面不是跟着黑丝的内容
- 同理,不会消耗文本,(预搜索)
- 也就是说,上面这个正则,在不匹配的时候,就算作成功(理解为 Python 中的取反)
正向后行断言(?<=正则)
- 表示字符串之前的内容必须匹配正则
- 正则表达式 :
(?<=我喜欢).
- 上面正则表达式会匹配到我喜欢后面的一个内容
反向后行断言(?<!正则)
- 这个就很好理解了
- 正则表达式 :
(?<!我喜欢).
- 上面的正向后行断言正则会匹配到我喜欢后面的一个内容
- 那反向后行断言就会匹配到
除了
我喜欢后面那个内容以外的其他任意
内容