正则表达式语法实际上是独立于任何语言的,在大多数编程语言都可以使用相同的语法。常见正则表达式语法请参考Python使用正则表达式处理字符串

正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体对待,例如'(red)+'可以匹配'redred'、'redredred'等一个或多个重复'red'的情况。使用子模式扩展语法可以实现更加复杂的字符串处理功能。

常用子模式扩展语法

语法

功能说明

(?P<groupname>)

为子模式命名

(?iLmsux)

设置匹配标志,可以是几个字母的组合,每个字母含义与编译标志相同

(?:...)

匹配但不捕获该匹配的子表达式

(?P=groupname)

表示在此之前的命名为groupname的子模式

(?#...)

表示注释

(?<=…)

用于正则表达式之前,如果<=后的内容在字符串中不出现则匹配,但不返回<=之后的内容

(?=…)

用于正则表达式之后,如果=后的内容在字符串中出现则匹配,但不返回=之后的内容

(?<!...)

用于正则表达式之前,如果<!后的内容在字符串中不出现则匹配,但不返回<!之后的内容

(?!...)

用于正则表达式之后,如果!后的内容在字符串中不出现则匹配,但不返回!之后的内容

>>> import re

>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name')    #使用命名的子模式
'Malcolm'
>>> m.group('last_name')
'Reynolds'
>>> m = re.match(r"(\d+)\.(\d+)", "24.1632")
>>> m.groups()      #返回所有匹配的子模式(不包括第0个)
('24', '1632')
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.groupdict()      #以字典形式返回匹配的结果
{'first_name': 'Malcolm', 'last_name': 'Reynolds'}
>>> exampleString = '''There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.'''
>>> pattern = re.compile(r'(?<=\w\s)never(?=\s\w)') #查找不在句子开头和结尾的never
>>> matchResult = pattern.search(exampleString)
>>> matchResult.span()
(172, 177)
>>> pattern = re.compile(r'(?<=\w\s)never') #查找位于句子末尾的单词
>>> matchResult = pattern.search(exampleString)
>>> matchResult.span()
(156, 161)
>>> pattern = re.compile(r'(?:is\s)better(\sthan)') #查找前面是is的better than组合
>>> matchResult = pattern.search(exampleString)
>>> matchResult.span()
(141, 155)
>>> matchResult.group(0)           #组0表示整个模式
'is better than'
>>> matchResult.group(1)
' than'
>>> pattern = re.compile(r'\b(?i)n\w+\b') #查找以n或N字母开头的所有单词
>>> index = 0
>>> while True:
     matchResult = pattern.search(exampleString, index)
     if not matchResult:
          break
     print(matchResult.group(0), ':', matchResult.span(0))
     index = matchResult.end(0)

not : (92, 95)
Now : (137, 140)
never : (156, 161)
never : (172, 177)
now : (205, 208)
>>> pattern = re.compile(r'(?<!not\s)be\b')       #查找前面没有单词not的单词be
>>> index = 0
>>> while True:
     matchResult = pattern.search(exampleString, index)
     if not matchResult:
          break
     print(matchResult.group(0), ':', matchResult.span(0))
     index = matchResult.end(0)

be : (13, 15)
>>> exampleString[13:20]    #验证一下结果是否正确
'be one-'
>>> pattern = re.compile(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)') #匹配有连续相同字母的单词
>>> index = 0
>>> while True:
      matchResult = pattern.search(exampleString, index)
      if not matchResult:
           break
      print(matchResult.group(0), ':', matchResult.group(2))
      index = matchResult.end(0) + 1

unless : s
better : t
better : t
>>> s = 'aabc abcd abbcd abccd abcdd'
>>> p = re.compile(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)')
>>> p.findall(s)
[('aabc', 'a'), ('abbcd', 'b'), ('abccd', 'c'), ('abcdd', 'd')]

>>> s = "It's a very good good idea"

>>> re.sub(r'(\b\w+) \1', r'\1', s)  #处理连续的重复单词
"It's a very good idea"

>>> re.sub(r'((\w+) )\1', r'\2', s)

"It's a very goodidea"

本文节选自《Python可以这样学》(董付国 著,清华大学出版社),略有增加。

Python正则表达式子模式扩展语法与应用相关推荐

  1. Python正则表达式之扩展语法(5)

    非捕获组和命名组 精心设计的正则表达式可能会划分很多组,这些组不仅可以匹配相关的子串,还能够对正则表达式本身进行分组和结构化.在复杂的正则表达式中,由于有太多的组,因此通过组的序号来跟踪和使用会变得困 ...

  2. Python正则表达式案例一则:单词非两端字符改为小写

    问题描述:给定一段英文,要求把其中所有单词除两端字符之外的其他字母都改为小写. 技术要点: 1)re模块的sub()函数用法: 2)match对象的group()方法. 参考代码: 运行结果: abc ...

  3. Python正则表达式中的贪心模式和非贪心模式

    声明:最近发现有人利用我在百度云盘里免费分享的127课Python视频盈利,并声称获得我的授权.在此,我声明,文末百度云盘里的Python视频是免费的,不会授权给任何人或机构进行销售.如果再发现有人卖 ...

  4. Python 正则表达式基本语法

    Python 正则表达式 前言 1. 正则表达式基本语法 1.1 正则表达式 *pattern* 有两种: 1.2 一些特殊的模式匹配字符 参考 前言 Python中的正则表达式与Perl中具有许多相 ...

  5. Python——正则表达式特殊符号及用法

    由于正则表达式的内容比较多,所以单独写成一系列文章,主要内容是根据小甲鱼所讲的内容综合一下正则表达式的笔记. 贴上小甲鱼的<Python3 如何优雅地使用正则表达式>系列可观看的博客地址: ...

  6. python正则表达式模块_Python正则表达式模块re

    正则表达式是一种通用的字符串匹配模式,使用灵活功能强大. Python正则表达式支持的语法可以参见这张表 Python的标准模块re提供了对正则表达式的支持,使用r'' 表示正则字符串可以避免转义字符 ...

  7. 偷学Python第三十一天:Python正则表达式的语法以及re模块的使用

    偷学Python第三十一天:Python正则表达式的语法以及re模块的使用 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 文章目录 偷学Python第三十一天:Python正则表达式的语 ...

  8. Python正则表达式语法快速入门

    文章目录 1 正则符号初阶 代码举例1:不同符号的组合 代码举例2:符号加`+`,代表连续的一个或多个 代码举例3:匹配字符串开始 代码举例4:匹配字符串结束 代码举例5:匹配单词边界 2 正则符号进 ...

  9. python 正则表达式 断言 不定长表达式_MyEssay 之 Python正则表达式 —— 四种断言扩展的理解...

    我们经常用正则表达式来检测一个字符串中包含某个子串,要表示一个字符串中不包含单个的某字符或某些字符也很容易,用[^...]形式就可以了.但是要表示一个字符串中不包含某个子串(由字符序列构成)的时候,用 ...

最新文章

  1. R语言使用latticeExtra包可视化双Y轴线图实战(Dual Y axis):单y轴线图、双y轴图线图、双y轴图线图(添加图例)
  2. 微软虚拟化平台现在可以管理VMware!
  3. C/C++调用Fortran的使用说明
  4. python田字格的输出的两种方法
  5. OpenCV4.4.0+VS2017 环境配置
  6. 通过javascript实现的轻量级模态框解决方案(支持Ajax)
  7. 高级数据结构---优先队列
  8. devops 开发_开发五年,DevOps手册问世
  9. hadoop生态系统学习之路(十)MR将结果输出到hbase
  10. 转换php时间戳,如何实现转换php时间戳
  11. 深度置信网络(DBN)
  12. 按键精灵不成熟的大漠游戏自动加血保护代码 大漠字库使用案例
  13. tftp服务器上传文件至华三ac,ftp和tftp 上传文件到h3c交换机
  14. Visual C++ 2010 Express使用教程
  15. MFC__ZPL语言Zbor打印机打印数据换行问题
  16. “玩具租赁/销售平台”类产品进化发展的可能性浅析
  17. 【中山大学计算机组成原理实验】单周期CPU设计与实现
  18. 【工业互联网】工业互联网与工业大数据分析的应用
  19. APl DOM文档对象模型
  20. openwrt查看网卡型号

热门文章

  1. mysql事件创建_mysql 创建事件
  2. 搜索做成html静态,如何在静态的html里实现搜索功能?
  3. php序列化函数输入0存不了,php序列化函数的区别
  4. linux dd 硬盘 脚本,如何使用dd命令测试Linux磁盘的读写速度
  5. java. 三个人比赛怎么写_两个乒乓球队进行比赛,找出三队赛手的名单
  6. m3u8手机批量转码_手机怎么把m3u8格式转换成mp4格式?
  7. linux下怎么创建root,Linux用root账号创建一个新的登录账号的方法
  8. Android studio修改包
  9. ubuntu 安装php redis,ubuntu上安装php redis
  10. python basemap的安装