一、正则表达式语法

(一) 字符与字符类

特殊字符

\.^$?+*{}[]()| 为特殊字符,若想要使用字面值,必须使用 \ 进行转义

字符类 []

[] 匹配包含在方括号中的任何字符。它也可以指定范围,例:

  • [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 表示不区分大小写

    • iIGNORECASE:忽略大小写,使匹配不区分大小写。
    • mMULTILINE:启用多行模式
    • sDOTALL:启用点字符(.)匹配任意字符,包括换行符。sspecial 的缩写。
    • xVERBOSE:启用详细模式,忽略空格和注释,可以使用多行形式编写更易读的正则表达式。可以用 [ ] \x20 (?-x: ) 表示空格。xextended 缩写
    • gGLOBAL: 查找所有符合条件的结果(Python 中不需要)
  • python 中 re.compile 的 flags 参数。flags 实质是一个数字,可以用 | 按位与传入多个标志
    • re.Are.ASCII
    • re.Ire.IGNORECASE
    • re.Mre.MULTILINE
    • re.Sre.DOTALL
    • re.Xre.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.Matchposendpos 限制查找区间
.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 正则表达式笔记】的更多相关文章

  1. Python正则表达式re模块学习遇到的问题

    Python正则表达式处理的组是什么? Python正则表达式处理中的匹配对象是什么? Python匹配对象的groups.groupdict和group之间的关系 Python正则表达式re.mat ...

  2. [Python学习笔记]正则表达式总结

    常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...

  3. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  4. Python正则表达式中的re.S

    title: Python正则表达式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正则表达式,python] --- 在Py ...

  5. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  6. python正则表达式re

    Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...

  7. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  8. Python正则表达式详解

    我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...

  9. 比较详细Python正则表达式操作指南(re使用)

    比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...

  10. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

随机推荐

  1. 将map转成vo实体

    //将map转成vo实体 AssetManagementProductsVO param= JSON.parseObject(JSON.toJSONString(map), AssetManageme ...

  2. ClassLoader 双亲委派

    一个程序有一个默认的appClassLoader.类不是由被调用者也不是被自身加载的,正常情况下是被默认的AppClassLoader加载的. System.out.println(test3.cla ...

  3. docker 学习之一 装MySQL 供远程使用 Linux

    因为Linux发行版本的问题折腾了好久,尽量使用LTS的版本.其他版本有时候缺的东西太多了,对新手相当不友好. 大概花了几天实在没招了,下了个LTS的版本,再装时正常了.按照官方文档都可以搞定了. 使 ...

  4. 一文快速回顾 Servlet、Filter、Listener

    什么是Servlet? 前置知识: Web 服务器:可以指硬件上的,也可以指软件上的.从硬件的角度来说, Web 服务器指的就是一台存储了网络服务软件的计算机:从软件的角度来说, Web 服务器指的是 ...

  5. SpringBoot笔记--配置文件分类+yaml相关知识+读取配置文件内容

    配置文件 要是需要使用自己的配置替换默认配置时,需要使用后缀名为application.properties或者application.yml(application.yaml)进行配置 当然,几个文 ...

  6. 使用 SpeechT5 进行语音合成、识别和更多功能

    我们很高兴地宣布,SpeechT5 现在可用于 Transformers (一个开源库,提供最前沿的机器学习模型实现的开源库). SpeechT5 最初见于微软亚洲研究院的这篇论文 SpeechT5: ...

  7. ROS话题通信C++(附launch启动方式)

    ROS话题通信C++(附launch启动方式) 创建工作空间 mkdir -p topic_ws/src cd topic_ws catkin_make 设置环境变量 source ./devel/s ...

  8. 基于声网 Flutter SDK 实现互动直播

    前言 互动直播是实现很多热门场景的基础,例如直播带货.秀场直播,还有类似抖音的直播 PK等.本文是由声网社区的开发者"小猿"撰写的Flutter基础教程系列中的第二篇,他将带着大家 ...

  9. java方法参数(超详细)

    前言 在上一篇文章中,壹哥给大家讲解了方法的定义.调用和返回值,但方法的内容还有很多,比如方法的参数是怎么回事?接下来壹哥会在这篇文章中,继续给大家讲解方法参数相关的知识,这就是我们今天要学习的内容. ...

  10. Spring竟然可以创建“重复”名称的bean?—一次项目中存在多个bean名称重复问题的排查

    作者:京东科技 韩国凯 一.项目中存在了名称重复的bean 众所周知,在Spring中时不能够创建两个名称相同的bean的,否则会在启动时报错: 但是我却在我们的spring项目中发现了两个相同名称的 ...