Python正则表达式子模式扩展语法与应用

正则表达式语法实际上是独立于任何语言的,在大多数编程语言都可以使用相同的语法。常见正则表达式语法请参考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小屋(Python_xiaowu)

原文发表时间:2017-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Kevin-ZhangCG

[ Java学习基础 ] Java异常处理

34060
来自专栏Fish

两天了解scala

最前面的话 因为spark的源语言是scala,所以,为了看懂spark的操作并且为了以后看spark源码做准备,先看scala还是很有必要的。另外这里主要是看...

20590
来自专栏专注数据中心高性能网络技术研发

[Effective Modern C++(11&14)]Chapter 3: Moving to Modern C++

24260
来自专栏坚毅的PHP

golang使用 mongo

 连接集群 mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:por...

31450
来自专栏小小挖掘机

这或许是我见过的最简单的正则表达式教程(二)

五一劳动节来啦,小小挖掘机们小编们首先祝大家劳动节快乐! 作为中国放假大学的一员,除了趁着长达8天的五一春假好好休整之外,当然还要忙中偷闲补习一下python的...

28440
来自专栏鸿的学习笔记

Python的数据结构整理

别名:maps, hashmaps, lookup tables, associative arrays

9740
来自专栏blackheart的专栏

[C#1] 4-通用对象操作

1.对象的等值性和唯一性 Object的Equals[虚]方法判断两个对象是否相等; Object.ReferenceEquals判断两个对象是否指向同一引用[...

23560
来自专栏GreenLeaves

JavaScript之JSON

一、简介:Json是JavaScript中读取结构化数据更好的方式。因为Json数据可以直接传给eval(),而且不必创建DOM对象。Json是一种数据格式,不...

27470
来自专栏me的随笔

C#字符串的不变性

  看过一些C#教程的人都应该知道这句话:“在C#中,一旦对字符串对象进行初始化,该字符串对象就不能再被该变“。这句话可用简单的图示来说明:

8310
来自专栏软件开发 -- 分享 互助 成长

排序算法总结

关于各种排序算法的总结表格,这里偷个懒直接用Simple life的博客http://blog.csdn.net/whuslei/article/details...

21750

扫码关注云+社区

领取腾讯云代金券