正则指引第二章量词学习笔记

本贴最后更新于 4347 天前,其中的信息可能已经时移俗易

2.1  一般形式


 表2-1  量词的一般形式

量词

说明

{n}

之前的元素必须出现n

{m,n}

之前的元素最少出现m次,最多出现n

{m,}

之前的元素最少出现m次,出现次数无上限

{0,n}

之前的元素可以不出现,也可以出现,最多出现n

(在某些语言中可以写为{,n})

2.2  常用量词

表2-2  常用量词

常用量词

{m,n}等价形式

说明

*

{0,}

可能出现,也可能不出现,出现次数没有上限

+

{1,}

至少出现1次,出现次数没有上限

?

{0,1}

至多出现1次,也可能不出现

 
 

表2-3  各类tag的匹配

匹配所有tag的表达式

tag分类

匹配分类tag的表达式

 

<[^>]+>

open tag

<[^/>][^>]*>

close tag

</[^>]+>

self-closing tag

<[^>/]+/>

注:这几个表达式不是很严谨,如匹配open tag的表达式,也可以匹配self-closing tag。作者说现有的知识还不足够解决这个问题而已,需要继续学习。
2.3  数据提取
In [1]: import re

In [2]: re.search(r"\d{6}", "ab123456cd").group(0)
Out[2]: '123456'

In [3]: re.search(r"^<[^>]+>$", "<bold>").group(0)
Out[3]: '<bold>'

In [4]: re.findall(r"\d{6}", "zipcode1:201203, zipcode2:100859")
Out[4]: ['201203', '100859']

2.4  点号
 
匹配除换行符外的所有字符
2.5   滥用点号的问题
因为点号能匹配几乎所有的字符,所以实际应用中许多人图省事,随意使用.*或.+,结果却事与愿违
之前介绍的量词都可以归到一类,叫做匹配优先量词(greedy quantifier,也有人翻译为贪婪量词 )。
匹配优先量词,顾名思义,就是在拿不准是否要匹配的时候,优先尝试匹配,并且记下这个状态,以备将来"反悔"。
回溯(backtracking)
 
re.search(r"\".*\"", "\"quoted string\" and another\"").group(0)
re.search(r'".*"', '"quoted string" and another"').group(0)
re.search(r"\"[^\"]*\"", "\"quoted string\" and another\"").group(0)
re.search(r'"[^"]*"', '"quoted string" and another"').group(0
2.6 忽略优先量词
匹配优先量词与忽略优先量词逐一对应,只是在对应的匹配优先量词之后添加?,
两者限定的元素能出现的次数也一样,遇到不能匹配的情况同样需要回溯;唯一的区别在于,
忽略优先量词会优先选择"忽略",而匹配优先量词会优先选择"匹配"。

表2-4  匹配优先量词与忽略优先量词

匹配优先量词

忽略优先量词

限定次数

*

*?

可能不出现,也可能出现,出现次数没有上限

+

+?

至少出现1次,出现次数没有上限

?

??

至多出现1次,也可能不出现

{m,n}

{m,n}?

出现次数最少为m次,最多为n

{m,}

{m,}?

出现次数最少为m次,没有上限

{,n}

{,n}?

可能不出现,也可能出现,最多出现n

2.7 转义

量词

转义形式

{n}

\{n}

{m,n}

\{m,n}

{m,}

\{m,}

{,n}

\{,n}

*

\*

+

\+

?

\?

*?

\*\?

+?

\+\?

??

\?\?

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 590 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 93 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 707 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 158 关注
  • 叶归
    7 引用 • 31 回帖 • 17 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 740 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 636 关注
  • CodeMirror
    2 引用 • 17 回帖 • 162 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 648 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 542 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 143 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 675 关注
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 2 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 407 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 648 关注
  • 倾城之链
    23 引用 • 66 回帖 • 168 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 3 关注
  • Follow
    4 引用 • 12 回帖 • 12 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖