python中正则表达式

概述

正则表达式,Regular Expression,缩写为regex、regexp、RE等。
正则表达式是文本处理极其重要的技术,用它可以对字符串按照某种规则进行检索、替换。
正则表达式应用及其广泛,shell中处理文本的命令、各种高级编程语言都支持正则表达式。

分类

1、BRE:正则表达式,grep、sed、vi等软件支持。vim有扩展
2、ERE:扩展正则表达式,egrep(grep-E)、sed-r等
3、PCRE:几乎所有高级语言都是PCRE的方言或者变种。Python1.6开始使用SRE正则表达式引擎,可以认为是PCRE的子集。

基本语法

元字符metacharacter

代码 说明 举例
. 匹配除换行符外任意一个字符 .
[abc] 字符集合,只能表示一个字符位置。匹配所包含的任意一个字符 [abc]匹配plain中的‘a’
[^abc] 字符集合,只能表示一个字符位置。匹配除去集合内字符的任意一个字符 [^abc]可以匹配plain中的‘p’、‘l’、‘i’或者’n’
a-z 字符范围,也是个集合,表示一个字符位置匹配所包含的任意一个字符 常用A-Z[0-9
[^a-z] 字符范围,也是个集合,表示一个字符位置匹配集合内字符的任意一个字符
\b 匹配单词的边界 \b b在文本中找到单词中b开头的b字符
\B 不匹配单词的边界 t\B包含t的单词但是不以t结尾的t字符
\d [0-9]匹配一位数字 \d
\D [^0-9]匹配1位非数字
\s 匹配1位空白字符,包括换行符、制表符、空格[\f\r\n\t\v]
\S 匹配1位非空字符
\w 匹配[a-zA-Z0-9] \w
\W 匹配\w之外的字符

详细分析

  • . 只能匹配一个非换行符(\n、\r、\r\n)外任意一个字符
    在这里插入图片描述
  • [abc]字符集合,只能匹配一个括号内包含的字符
    在这里插入图片描述

在这里插入图片描述

  • [a-z]匹配除了a到z的其它字符,其中代表取反
    在这里插入图片描述
  • \s匹配所有空白字符(包括换行符、制表符、空格(\f\r\n\t\v))
    c后面后换行符
    在这里插入图片描述
  • []只表示匹配一个字符,不带[]表示原来的意思
  • 在这里插入图片描述
  • \b 匹配单词的边界(单词的边界可以认为是两个字母之间有分隔)
    在这里插入图片描述
  • \后面加大写字母取反义

在这里插入图片描述

  • \d相当于[0-9] \D相当于匹配非[0-9]
  • \w相当于匹配[a-zA-Z0-9]和中文,\W匹配除\w字符
    在这里插入图片描述
    在这里插入图片描述
转义

凡是在正则表达式中有特殊意义的符号,如果想使用它的本意,需要转义,反斜杠自身,需要使用\
\r和\n转义后还是代表回车、换行

重复
代码 说明 举例
* 表示前面的正则表达式会重复出现0次或多次 e\w*单词中e后面可以有非空白字符
+ 表示前面的正则表达式重复至少1次 e\w单词后面至少有一个非空白字符
表示前面的正则表达式会重复0次或1次 e\w?单词中e后面至多有一个非空白字符
{n} 重复固定的n次 e\w{1} 单词中e后面只能有一个非空白字符
{n,} 重复至少n次 e\w{1,}等价于e\w+,e\w{0,}等价e\w*,e\w{0,1}等价e\w?
{n,m} 重复n到m次 e\w{1,10}单词中e后面至少1个,至多10个非空白字符
代码 说明 举例
x y 匹配x或者y
捕获
(pattern) 使用小括号指定一个子表达式,也叫分组捕获后会自动分配组号从1开始可以改变优先级

组号默认从1开始,分组0指的是匹配分组
在这里插入图片描述

(?:pattern) 如果仅仅为了改变优先级,就不需要捕获分组 (?:w | f)ood ‘industr(?:y | ies)等价于’industry | industries’

在这里插入图片描述

\数字 匹配对应的分组

后面的\1代表复制group1的游戏
在这里插入图片描述
将\1变为\2后
在这里插入图片描述
|(?:exp)

(?'name’exp) 命名分组捕获,但是可以通过name访问分组,Python语法必须是(?Pexp)

将分组进行命名

在这里插入图片描述

零宽断言
(?=exp) 零宽度正预测先行断言,断言exp一定在匹配的右边出席那,也就是说断言后面一定跟个exp

在这里插入图片描述

(?<=exp) 零宽度正回顾后发断言,断言exp一定出席那在匹配的左边出现,也就是前面一定有个exp前缀

在这里插入图片描述

负向零宽断言
(?!exp) 零宽度负预测先行断言,断言exp一定不会出现在右侧,也就说断言后面一定不是exp

在这里插入图片描述
|(?<!exp) |零宽度负回顾后发断言,断言exp一定不能出现在左侧,也就是说断言前面一定不能是exp |
在这里插入图片描述
注意:
断言会不会i捕获呢?也就是断言占不占分组符
断言不沾分组号,断言部分不会出现在分组中
分组和捕获是同一个意思
使用正则表达式时,能用简单表达式,就不要复杂的表达式

贪婪与非贪婪

默认是贪婪模式,也就是说尽量多匹配更长的字符串
非贪婪很简单,在重复的符号后面加一个?问号,就尽可能的少匹配了

代码 说明
*? 匹配任意次,但尽可能少重复
+? 匹配至少1次,但尽可能少重复
?? 匹配0次或1次,但尽可能少重复
{n,}? 匹配至少n次,但尽可能少重复
{n,m} 匹配至少n次,至多m次,但尽可能少重复
  • *? 非贪婪不匹配次数
    在这里插入图片描述
  • +?非贪婪只匹配一次

在这里插入图片描述

  • ??非贪婪不匹配次数
    在这里插入图片描述
引用引擎选项
代码 说明 python
IgnoreCase 匹配时忽略大小写 re.l或re.IGNORECASE
Singleline 单行模式,可以匹配所有字符,包括\n re,S或re,DOTALL
Multiline 多行模式^行首、$行尾 re.M或re,MULTILINE
IgnorePatternWhitespace 忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来做注释 re,X或re.VERBOSE

单行模式:

  • .可以匹配所有字符,包括换行符
  • ^表示整个字符串的开头,$整个字符串的结尾

多行模式

  • .可以匹配除了换行符之外的字符,多行不影响.
  • ^表示行首,$行尾,只不过这里的行是每一个行

默认模式:可以看作待匹配的文本是一行,不能看作多行,,点号不能匹配换行符,^和 . 表示行首和行尾,而行首行尾就是整个字符串的开头和结尾 单行模式:基本和默认模式一样,只是.点号终于可以匹配任意一个字符包括换行符,这是所有文本就是一个长长的只有一行的字符串,^就是这一行字符串的行首, 就是这一行的行尾
多行模式:重新定义了行的概念,但不影响,点号的行为,^和$还是行首行尾的意思,只不过因为多行模式可以识别换行符了,开始指的是\n后紧接着下一个字符,结束指的是\n前的字符,注意最后一行结尾可以没有\n
简单讲,单行模式之影响,行为,多行模式重新定义行印象^和 $
默认模式下.功能照旧
在这里插入图片描述
单行模式下增强.的功能,所有都可匹配
在这里插入图片描述
多行下照旧
在这里插入图片描述
多行模式和单行模式都选择情况下,增强,的功能
在这里插入图片描述