老夫的正则表达式大成了,桀桀桀桀!!!【Python 正则表达式笔记】
一、正则表达式语法
(一) 字符与字符类
特殊字符
\.^$?+*{}[]()| 为特殊字符,若想要使用字面值,必须使用 \ 进行转义
字符类 []
[] 匹配包含在方括号中的任何字符。它也可以指定范围,例:
[a-zA-Z0-9]表示a到z,A到Z,0到9之间的任何一个字符[u4e00-u9fa5]匹配 Unicode 中文[^\x00-\xff]匹配双字节字符(包括中文)
在 [] 中:
[^]表示否定字符类,比如[^0-9]表示可以匹配一个任意非数字的字符^放在第一个位置表示否定,放在其他位置表示字面值\表示转义-放在中间表示范围,放在其他位置表示字面值- 其他特殊字符不再具备特殊意义,都表示字面值
- 字符类内部可以使用速记法,比如
\d \s \w
速记法
.可以匹配除换行符之外的任何字符,如果有 re.DOTALL 标志,则匹配任意字符包括换行\d匹配一个 Unicode 数字,如果有 re.ASCII 标志,则匹配0-9\D匹配 Unicode 非数字\s匹配 Unicode 空白,如果带有 re.ASCII 标志,则匹配\t\n\r\f\v中的一个\S匹配 Unicode 非空白\w匹配 Unicode 单词字符,如果带有 re.ASCII 标志,则匹配[a-zA-Z0-9_]中的一个\W匹配 Unicode 非单词字符
(二)量词
?0次或1次*0次或多次+1次或者多次{m}m次{m,}至少m次{,n}最多n次{m,n}至少m次,最多n次
注意点:以上量词都是「贪婪模式」,后加 ? 切换为「最小匹配模式」
(三) 断言
断言不会匹配任何文本,只是施加约束。常用断言:
\b匹配单词的边界,放在字符类[]中则表示backspace\B匹配非单词边界,受ASCII标记影响\A在起始处匹配\Z在结尾处匹配^在起始处匹配,如果有 MULTILINE 标志,则在每个换行符后匹配$在结尾处匹配,如果有 MULTILINE 标志,则在每个换行符前匹配
(四)捕获组
()的作用:
()是一个捕获组,可被\N引用,N是序号,以左括号排位决定。\0表示整个匹配的内容。(?:)可以关闭捕获,只用作分组- 使用
|组合多个表达式,表示「或」 (?=...)向前正项匹配,前方必须存在。 如\w(?=,)匹配apple, banana中的apple(?!...)向前负项匹配,前方必须没有(?<=...)向后正项匹配,后方必须存在(?<!...)向后负项匹配,后方必须没有
命名捕获组:
| 语言 | 命名捕获组 | 搜索中引用 | 替换中引用 |
|---|---|---|---|
| Python | (?P<name>...) |
\N (?P=name) |
\N \g<name> $N |
| JavaScript | (?<name>...) |
\N \k<name> |
$N |
| .NET | (?<name>...) (?'name'...) |
\N \k<name> \k'name' |
$N ${N} ${name} |
| Perl | (?<name>...) (?'name'...) |
\N \gN \g{N} \g{name} (?N) (?+N) (?-N) (?Name)兼容 .Net Python 的语法 |
$N ${N} $+{Name} |
技巧:
- 在搜索中,若
\12无法表示「第一个捕获组 + 数字2」,可用(?:\1)2或者\1[2]表示 - 在替换中,若
$12无法表示「第一个捕获组 + 数字2」,可以用$1\l2或者$1\u2表示
(五)条件匹配
(?(id)yes_exp|no_exp):对应id的子表达式如果匹配到内容,则这里匹配yes_exp,否则匹配no_exp- Perl 支持的语法:
(?(N)Yes|No) (?(<Name>)Yes|No) (?('Name')Yes|No) (?(?=Ahead)Yes|No)
实测 JavaScript 不支持条件匹配
(六)替换语法补充
一些在替换中使用的语法:
| 替换语法 | 作用 |
|---|---|
\l |
下一个字符输出小写 |
\L |
下一串字符输出小写 |
\u |
下一个字符输出大写 |
\U |
下一串字符输出大写 |
\E |
终止 \U 和 \L |
| 语言 | 引用匹配之前的文本 | 引用匹配文本 | 引用匹配之后的文本 |
|---|---|---|---|
| Perl | ${^PREMATCH} | ${^MATCH} |
${^POSTMATCH} |
(七) 标志
传标志方法:
- 正则表达式开头加标志
(?flags)pattern,如(?im)apple表示不区分大小写i或IGNORECASE:忽略大小写,使匹配不区分大小写。m或MULTILINE:启用多行模式s或DOTALL:启用点字符(.)匹配任意字符,包括换行符。s是special的缩写。x或VERBOSE:启用详细模式,忽略空格和注释,可以使用多行形式编写更易读的正则表达式。可以用[ ] \x20 (?-x: )表示空格。x是extended缩写g或GLOBAL: 查找所有符合条件的结果(Python 中不需要)
- python 中 re.compile 的 flags 参数。flags 实质是一个数字,可以用
|按位与传入多个标志re.A或re.ASCIIre.I或re.IGNORECASEre.M或re.MULTILINEre.S或re.DOTALLre.X或re.VERBOSE
注释示例,匹配 <img> 标签:
pattern = re.compile(r"""(?ix) # i 表示忽略大小写,x 表示开启注释模式
<img\s+ #标签的开始
[^>]*? #不是src的属性
src= #src属性的开始
(?P<quote>["']) #左引号
(?P<image_name>[^"'<>]+?) #图片名字
(?P=quote) #右括号
[^>]*? #不是src的属性
> #标签的结束
""")
二、Python正则表达式模块
模块级 :
| 方法、属性 | 作用 |
|---|---|
compile(pattern) |
预先编译正则表达式,返回 re.Pattern 对象 |
search(pattern, string, flags=0) |
查找匹配的部分,返回 re.Match |
match(pattern, string, flags=0) |
从头匹配,返回符合规则的第一个值 re.Match |
fullmatch(pattern, string, flags=0) |
完全匹配(要从头到尾都匹配),返回 re.Match |
split(pattern, string, maxsplit=0) |
用匹配到的内容作为分割符,分割后,返回列表 |
findall(pattern, string) |
查找所有,返回为列表,元素为 str。如果有捕获组,则列表元素为 tuple,包含空结果。 |
finditer(pattern, string) |
查找所有,返回为 re.Match 的迭代器。 |
sub(pattern, repl, string, count=0) |
返回替换后的字符串,repl 可以是一个函数(接收 Match,返回替换后的值) |
subn(pattern, repl, string, count=0) |
返回元组 (new_str, number),包含了替换次数 |
escape(pattern) |
将特殊字符转义后返回,如 . 会返回 \. |
purge() |
清除缓存 |
re.compile() 可以预先编译正则表达式,返回 re.Pattern 对象,以提高匹配效率
| 方法、属性 | 作用 |
|---|---|
.search(string[, pos[, endpos]]) |
查找匹配的部分,返回 re.Match,pos 和 endpos 限制查找区间 |
.match(string[, pos[, endpos]]) |
|
.fullmatch(string[, pos[, endpos]]) |
|
.split(string, maxsplit=0) |
|
.findall() |
|
.finditer() |
|
.sub(repl, string, count=0) |
|
.subn(repl, string, count=0) |
|
.flags |
|
.groups |
有几个捕获组 |
.groupindex |
一个字典,命名捕获组与序号对应 |
.pattern |
re.Match 对象用于表示正则表达式匹配的结果:
| 方法、属性 | 作用 | |
|---|---|---|
Match.group([group1, ...]) |
返回:捕获组,或多个捕获组 tuple | |
Match[0] |
等同于 group(0) |
|
.group() |
等同于 group(0) |
|
.groups(default=None) |
返回:元组,所有的子捕获组 (1, 2, 3...)。没有捕获到的组返回为 None。 | |
.groupdict(default=None) |
返回:词典,只包含有命名的捕获组 | |
.start() |
返回:匹配的起始位置 | |
.end() |
返回:匹配的结束位置 | |
.span() |
返回:元组 (start, end) | |
.expand(template) |
用捕获到的组将 template 中的组引用展开 |
|
.pos |
匹配开始的索引位置 | |
.endpos |
匹配结束的索引位置 | |
.lastindex |
最后一个捕获组的索引 | |
.lastgroup |
最后一个捕获组的名字 | |
.string |
传入的字符串 |
老夫的正则表达式大成了,桀桀桀桀!!!【Python 正则表达式笔记】的更多相关文章
- Python正则表达式re模块学习遇到的问题
Python正则表达式处理的组是什么? Python正则表达式处理中的匹配对象是什么? Python匹配对象的groups.groupdict和group之间的关系 Python正则表达式re.mat ...
- [Python学习笔记]正则表达式总结
常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- Python正则表达式中的re.S
title: Python正则表达式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正则表达式,python] --- 在Py ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
- python正则表达式re
Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- Python正则表达式详解
我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...
- 比较详细Python正则表达式操作指南(re使用)
比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...
- Python正则表达式学习摘要及资料
摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...
随机推荐
- Go_day07
Go常用包 包的本质:创建不同的文件夹,来存放程序文件 Go语言的源码复用建立再包package基础之上 main包 Go语言的入口 main()函数所在的包必须是main包 main包需要引用代码, ...
- Pytorch基础复习
项目推进中期,重新到头来学Pytorch.five落泪了.(╬▔皿▔)凸 笑死,憋不住了,边更边学. 整篇博客整体采用总分总形式.首先将介绍内容(加黑部分)之间关系进行概括,后拆解,最后以图总结. 全 ...
- 02-Spring基于XML的Bean属性注入
属性值注入:就是给属性赋值 创建一个Account类: public class Account implements Serializable { private int aid; private ...
- 远程链接linux编程shell脚本
WinSCP-5.15.3-Setup.exe https://pan.baidu.com/s/1zr7ipq8i5rqm8tYS8GeKsQ
- 对于MyBatis的模糊查询的实现+文本框、单选框以及复选框的数据回显的实现
MyBatis的模糊查询sql语句与之前使用的不太一样 主要是利用下面这种语句实现的(查了好久的,认真记一下吧!) select * from huodong where theme like con ...
- .Net7 CLR的调用函数和编译函数
前言 .Net运行模型,无非就两个过程.一个是调用入口函数,另外一个就是编译入口函数.前者主调用,后者主编译. 概括 一:入口函数:RunMainInternal 所有的.Net程序,包括控制台,We ...
- CF859E题解
题意简述 翻译很清楚了 题目解法 如果一个人想去的位置上原来坐着人,那么他要坐到这个位置上,就要把原来的人赶走. 原来的人被赶走了,就只能去想去的位置.如果那个位置上有人,又要把那个人赶走. 我们发现 ...
- GUI编程--1
GUI编程--1 GUI是什么 (Graphical User Interface),即用户图形界面编程. 怎么玩 平时怎么运用 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 1.简介 ...
- XAML 设计器已意外退出。(退出代码: e0434352)
一.前言 开门见山,这个问题我遇到过两次,第一次因为项目刚开始不长时间,我查了很长时间都没解决,然后就直接重写了,几乎一样的写法,但问题没复现了,但程序员思维告诉我,一定还是有比较关键的地方出现了问题 ...
- 存储系统模拟—R实现
存储系统 存储问题是人们最熟悉又最需要研究的问题之一.例如企业储存的原材料.在制品等,存储太少,不足以满足生产的需要,将使生产过程中断; 存储太多,超过了生产的需要,将造成资金及资源的积压浪费.商店储 ...