Python 基础 - Day 5 Learning Note - 模块 之 标准库:RE (14) 正则表达式

时间:2021-11-16 03:46:21

RE 模块介绍

正则表达式(RE)用作于处理文件和数据,为高级文本模式匹配,以及搜索-替代等功能提供基础。 实质就是一些由字符和特殊符号(元字符:metacharacter)组成的字符串,它们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串的集合,也能按某种模式匹配一系列有相似特征的字符串,我们称为模式匹配 (patten match)。 在python中, pattern-match 有两种主要方式完成: 搜索(search)和匹配(match)。 搜索,在字符串任意部分中搜索匹配的模式;匹配,判断一个字符串能否从起始处全部或部分的匹配某个模式。

基础知识总结文

静态匹配: 自己匹配自己。

动态匹配:涉及以下metacharacter

元字符表 metacharacter 

source: python 核心编程(3rd version)

符号 描述 正则表达式 匹配的字符串
 使用择一匹配多个正则表达式模式,也称为union 或 Logical OR
 re1|re2 匹配正则表达式re1re2 bat|bet|bit bat、bet、bit 
匹配任意单个字符
 .  

匹配任何字符(除了\n之外),

包括字母、数字、空格(并不包括“\n”换位符)、可打印和不可打印字符。

显示句点符号本身,需要用”\.“  

当 flag是re.DOTALL标记,则\n也可匹配

f.o  匹配在字母“f”和“o”之前任意一个字符;例如fao,f9o,f#o 
.. 任意两个字符 
 .end 匹配在字符串“end”之前的任意一个字符 
从字符串起始或者结尾或者单词边界匹配   
^或\A 匹配字符串起始部分  ^Dear  任何以Dear作为起始的字符串
$或\Z 匹配字符串终止部分   /bin/tesh$ 任何以/bin/tesh作为结尾的字符串
    ^Subject:hi$ 任何由单独的字符串Subject:hi构成的字符串 
\bBb 匹配一个单词的边界  \bthe 任何以the开始的字符串
 \bthe\b 仅仅匹配单词the 
\B 匹配出现在一个单词中间的模式 \Bthe  任何包含但并不以the作为起始的字符串 
创建字符集,限定范围和否定
[...]  匹配来自字符集的任意单一字符  b[aeiu]t bat、bet、bit、but 
 [cr][23][dp][o2] 一个包含四个字符的字符串,例如c2do\r3p2等
 [..x-y..] 匹配x~y范围中的任意单一字符  z.[0-9] 字母"z"后跟着任何字符,然后跟着一个数字
  [^...]  不匹配此字符集]中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现)   [^aeiou]  一个非元音字符,不匹配a,e,i,o,或u
[^\t\n] 不匹配制表符\t或\n 
使用闭包操作符实现存在性和频数匹配   
* (其左边)匹配0次或者多次前面出现的正则表达式 - Kleene闭包 (贪婪模式) [A-Za-z0-9]*  
+ 匹配1次或者多次前面出现的正则表达式 - 正闭包操作符 (贪婪模式) [a-z]+\.com  
匹配0次或者1次前面出现的正则表达式 (非贪婪模式) [dn]ot? t出现一次或者不出现,即do,no,dot,not
    </?[^>]+> 匹配全部有效(和无效的)HTML标签
{} {N}精确匹配N次前面出现的正则表达式;{M,N}匹配M~N次前面出现的正则表达式  [0-9]{15,16} 匹配15或者16个数字(例如信用卡号码)
          
表示字符集的特殊字符
 \d 匹配任何十进制数字, 等于[0-9]  \d{3}-\d{3}-\d{4} 美国电话号码的格式
 \D 不匹配任何非数值型的数字, 等于[^0-9]     
 \w 匹配任何字母数字字符,等于[A-Za-z0-9]   \w+@\w+\.com 以XXX@YYY.com格式表示的简单电子邮件地址 
\W  不匹配任何字母数字,等于[^A-Za-z0-9]     
 \s 匹配任何空格字符,等于[\n\t\r\v\f] (\S与之相反)    
使用圆括号指定分组
(...)  匹配()里的正则表达式,也表示一个子组; 用groups来体现  \d+(\.\d*)? 表示简单浮点数的字符串;也就是说,任何十进制数字,后面可以接一个小数点和零个或者多个十进制数字 
(Mr?s?\.)?[A-Z][a-z]*[A-Za-z-]+ 名字和姓氏, 以及对名字的限制(如果有,首字母大写,后续小写),全名前可以有可选"Mr.""Mrs.""Ms。"或”M“作为称谓。以及灵活可选的姓氏,可以有多个单词、横线以及大写字母
扩展表示法 
 (?...) 在判断匹配之前提供标记,实现一个前视(或者后视)匹配或者条件检查;不会保存为子组,除了(?P<name>)表示为一个分组匹配    
 (?:...)   类似(...),但是不保存为子组  (?:\w+\.)* 以句点作为结束的字符串,列如:"google." , "twitter."等,但是这些匹配不会保存下来供后续使用
(?iLmsux) 在正则表达式中嵌入一个或者多个特殊“标记“参数(或者通过函数/方法 (?x)  
(?#...) 表示注释,所有内容都被忽略   (?#comment) 不做匹配,只是注释
(?=...) 匹配条件是如果...出现在之后的位置,而不使用输入字符串;称作正向前视断言   (?=.com)  如果一个字符串后面跟着”.com“才做匹配,并不使用任何目标字符串
 (?!...) 匹配条件是如果...不出现在之后的位置,而不使用输入字符串;称作负向前视断言  (?!.net) 如果一个字符串后面不是跟着”.net“才做匹配
 (?<=...) 匹配条件是如果...出现在之前的位置,而不使用输入字符串;称作正向后视断言   (?<=800-) 字符串之前为"800-"才匹配, 同样,并不使用任何目标字符串
 (?<!...) 匹配条件是如果...出现在之前的位置,而不使用输入字符串;称作负向后视断言  (?<!192\.168\.) 字符串非”192.168“才做匹配,假定用于过滤掉一组C类IP地址
 (?(id/name)Y|N)  如果分组所提供的id或name(名称)存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N; |N是可选项 (?(1)y|x) 如果一个匹配组1(\1)存在,就与y匹配;否在就与x匹配

常用函数

re.group() 和 re.groups()

re.group()        返回整个匹配对象,或返回特定子组
re.groups()      返回一个包含唯一或者全部子组的元祖 

re.match(): 匹配

re.match(”模式“,"字符串"): 试图从字符串的起始部分对模式进行匹配。如果匹配成功,返回一个匹配对象;如果失败,就返回None。 如果匹配失败,会抛出AttributeError异常,所以一般我们用下面方法防止捕捉错误。

Python 基础 - Day 5 Learning Note - 模块 之 标准库:RE (14) 正则表达式Python 基础 - Day 5 Learning Note - 模块 之 标准库:RE (14) 正则表达式
m = re.match("foo", "foo")
if m is not None:
m.group()
match列子
Python 基础 - Day 5 Learning Note - 模块 之 标准库:RE (14) 正则表达式Python 基础 - Day 5 Learning Note - 模块 之 标准库:RE (14) 正则表达式
re.match("bat|bet|bit“, "bat")   # 匹配多个字符串

re.match(
".end", "bend") # ”.“ 除了换行符及非字符之外,所有的字符
View Code

 re.search() :搜索

用法和match 完全一致,不过search 搜索模式在字符串中第一次出现的位置,并且严格地字符串从左到右搜索

re.findall() & re.finditer():查询

findall 查询字符串中某个re模式全部的非重复出现情况。 把所有匹配到的字符放到以列表中的元素范围。 子组搜索是允许从当个正则表倒式抽取特定模式,多个子组匹配成功,每组成功匹配为返回列表中的一个元祖,每个成功匹配为元祖中的一个元素。 

finditer比findall更节省内存。 finditer在匹配对象中迭代,不返回所有。

Python 基础 - Day 5 Learning Note - 模块 之 标准库:RE (14) 正则表达式Python 基础 - Day 5 Learning Note - 模块 之 标准库:RE (14) 正则表达式
import re

s
= "This and that. thus and thin"
findall
= re.findall(r'(th\w+) and (th\w+)', s, re.I) # 返回[('This', 'that'), ('thus', 'thin')]
print(findall)
# 返回[('This', 'that'), ('thus', 'thin')]

finditer
= re.finditer(r'(th\w+) and (th\w+)', s, re.I)
print(finditer)
# 返回<callable_iterator object at 0x0000020904E53748>

# 依次打印元素
for g in finditer:
print(g.groups())
findall & finditer

re.sub() & re.subn():搜索替换

匹配并进行某种形式的替换。 subn比sub多返回一个表示替换的总数

re.split() 分隔

re.split()  正则表达式的模式分隔字符串。 可以通过max设定最大分隔数。

re.complile() 编译

re.compile()   将正则表达式 编译成 正则表达对象。 尽管推荐预编译,但是不是必须。不编译就直接函数。

模块常用属性

re模块属性 描述
re.I 不区分大小写的匹配、
re.IGNORECASE
re.L 根据所使用的语言环境通过\w、\W、\b、\B、\s、\S实现匹配
re.LOCALE
re.M ^和$分别匹配目标字符串中行的起始和结尾,而不是严格匹配整个字符串的起始和结尾
re.MULTILINE
re.S “.”(点号)通常匹配除了\n(换行符)之外的所有单个字符;该标记表示"."(点好)能够匹配全部字符
re.DOTALL
re.X 通过反斜线转义,否在所有空格加#都被忽略,除非在一个字符类中或者允许注释并提高可读性
re.VERBOSE