规则表达式(Regular Expression, RE),又称作正则表达式,通常用于检索、替换符合指定规则的文本,正则表达式定义的规则,称作模式(Pattern),即正则表达式的作用是从文本中查找到符合模式的文本。在Python中使用正则表达式,需要导入re模块。

import re

Python中的正则表达式大致分为以下几部分:元字符、函数和匹配选项和内置对象。

一,元字符

正则表达式定义了一个模式(Pattern),模式中既包含用于表示规则的特殊字符(称作元字符),也包括正常的文本字符。元字符用于定义匹配的特殊模式。re模块支持的元字符如下(不包括分组和断言查找):

  • .        匹配任意字符(不包括换行符)
  • ^       匹配开始位置,多行模式下匹配每一行的开始
  • $       匹配结束位置,多行模式下匹配每一行的结束
  • *        匹配前一个元字符0到多次
  • +        匹配前一个元字符1到多次
  • ?        匹配前一个元字符0到1次
  • {m,n}  匹配前一个元字符m到n次
  • \\        转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符
  • []        字符集,一个字符的集合,可匹配其中任意一个字符
  • |         逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
  • \A       匹配字符串开始位置,忽略多行模式
  • \Z       匹配字符串结束位置,忽略多行模式
  • \b       匹配位于单词开始或结束位置的空字符串
  • \B       匹配不位于单词开始或结束位置的空字符串
  • \d       匹配一个数字, 相当于 [0-9]
  • \D       匹配非数字,相当于 [^0-9]
  • \s        匹配任意空白字符, 相当于 [ \t\n\r\f\v]
  • \S        匹配非空白字符,相当于 [^ \t\n\r\f\v]
  • \w        匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
  • \W        匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]

注意:正则表达式是区分大小写的,元字符的大写和小写形式表示的含义是不同的。元字符实际上是由字符“\”和普通字符构成的,“\”称作转义字符,也就是说,“\”的作用是把普通字符转换为特殊的字符。

由于特殊字符也是文本中的字符,当模式需要匹配这些特殊字符时,例如,文本中包含”\”,”.”等特殊字符时,必须使用转义字符,把特殊字符转义为普通字符。推荐使用原生字符串类型(raw string)来书写正则表达式,只需要在表达式前面加个“r”即可,如下:

r'\d{2}-\d{8}'
r'\bt\w*\b'

二,re模块常用的函数

从帮助文档中可以看到,re模块导出的函数主要是:match、search、sub、split、findall、finditer、compile和escape,这些函数中,通常有三个参数,string:用于匹配的文本,pattern:正则表达式的模式,flags:匹配选项,flags 默认为0 ,不使用任何模式。

正则表达式的flag主要有:

  • I:IGNORECASE, 忽略大小写的匹配模式
  • M:MULTILINE,多行模式, 改变 ^ 和 $ 的行为
  • S:DOTALL,此模式下 ‘.’ 的匹配不受限制,可匹配任何字符,包括换行符
  • X:VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式
  • U:UNICODE,使用 \w, \W, \b, \B 这些元字符时将按照 UNICODE 定义的属性.

正则表达式可以同时使用多个flag,在 Python 里面使用按位或运算符 | 同时添加多个fag,例如 re.compile(”, re.I|re.M|re.S)

1,编译和转义

compile函数用于编译一个正则表达式模块,便于复用,

re.compile(pattern, flags=0) 
re.escape(pattern) 

转义函数的作用,和r’pattern’的作用相同,便于编写正则表达式,避免出现过多的转义字符。

print( re.escape(".+\d123"))
# output> \.\+\\d123

3,匹配第一个

正则表达式有两个匹配函数,match和search函数,这两个函数的相同之处:返回第一个匹配的对象,一旦匹配成功,就不再继续查找,返回一个SRE_Match 对象;如果找不到,则返回None。

re.match(pattern, string, flags=0) 
re.search(pattern, string, flags=0) 

不同之处在于:re.match函数从字符串的开头查找,如果开头不匹配,则不再继续查找,返回None;而re.search匹配整个字符串,直到找到第一个匹配(注意:仅仅是第一个)或者没有匹配到任何文本。

5,匹配所有

re.findall在字符串中找到匹配正则表达式的所有文本,作为一个列表返回,如果没有找到匹配,则返回空列表:

re.findall(pattern, string, flags=0) 

re.finditer在字符串中找到匹配正则表达式所的所有文本,并把它们作为一个迭代器返回:

re.finditer(pattern, string, flags=0) 

6,替换匹配的字符

把正则表达式 pattern 匹配到的字符串替换为 repl 指定的字符串,  参数 count 用于指定最大替换次数,默认值是o,表示无限大。

re.sub(pattern, repl, string, count=0, flags=0)

替换函数可以把文本的标点符号和HTML标签去掉。

三,re内置的对象

SRE_Pattern 对象是编译后的正则表达式,编译后不仅能够复用和提升效率,同时也能够获得一些其他的关于正则表达式的信息,该对象的属性:

  • flags 编译时指定的模式
  • groupindex 以正则表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
  • groups 正则表达式中分组的数量
  • pattern 编译时用的正则表达式

SRE_Match对象保存匹配的结果,包含很多关于匹配过程以及匹配结果的信息,该对下的属性:

  • endpos       本次搜索结束位置索引
  • lastgroup    本次搜索匹配到的最后一个分组的别名
  • lastindex    本次搜索匹配到的最后一个分组的索引
  • pos          本次搜索开始位置索引
  • re           本次搜索使用的 SRE_Pattern 对象
  • regs         列表,元素为元组,包含本次搜索匹配到的所有分组的起止位置
  • string       本次搜索操作的字符串

四,表达式的分组和断言查找

正则表达式的分组和断言查找,请参考《正则表达式和文本挖掘(Text Mining)》。

 

参考文档:

在python中使用正则表达式(一)

python正则表达式详解

版权声明:本文为ljhdo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ljhdo/p/10588807.html