热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3正则表达式_re模块_教程详解_笔记_完整内容

正则表达式,用于在一大堆数据中查找信息,学习后有利于爬虫信息抓取。“.^$*+?{}[]|()”是元字符(关键字),如要匹配原字符则需加“”,如

Python3正则表达式_re模块_教程详解_笔记_完整内容

正则表达式,用于在一大堆数据中查找信息,学习后有利于爬虫信息抓取。

 

“. ^ $ * + ? { } [ ] | ( )”是元字符(关键字),如要匹配原字符则需加“”,如“[”“\”。为避免与转义符( 、)冲突,可在字符串前加r,即 r"" 或 r"" 。

 

字符
“d”表示数字
“D”表示非数字的字符
“s”表示空白字符,相当于[ fv]
“S”相当于[^ fv]
“w”表示数字或字母
“W”表示非数字和字母的字符
“.”表示除换行符" "外的所有字符,DOTALL模式下可匹配任何字符(包括" ")
“[]”整体为一个字符,其中的内容表示"或者"关系,同时元字符全部失效。如:[12]表示"1"或"2",[a-z]表示小写字母(包括扩展拉丁字母如 "é"),[A-Za-z]表示所有字母,而[^a]表示除"a"以外的所有字符,[a^]表示"a"或"^"。由于元字符失效,从而可以 "[ ]" 的方式表示回车符等转义符,但复杂情况下仍推荐使用 r""。

 

 

以下字符都不代表实际字符,即所谓零宽度,称为断言
“^”指示行的开头,不代表实际字符,如MULTILINE模式下以“^a”去匹配“b ab”则span=(2, 3)。若不是MULTILINE,则仅指示字符串开头。
“$”指示行的末尾。同样需要MULTILINE
“A”指示字符串的开头
“”指示字符串的末尾
“”指示词边界,即每个单词的开头和结尾,单词结构中可包括数字和字母,其他字符如空格逗号可以将其分割为一个个单词。可以指示字符串开头。可能与退格符""冲突,加r或使用"\b"。
“|”表示或者,优先级比普通字符还低,如“phone|tele”表示"phone"或"tele"
而“()”可控制“|”的范围,如“the (phone|tele)”

 

 

 

重复
“*”表示前一个字符重复0~+inf次
“+”表示前一个字符重复1~+inf次
“?”表示前一个字符重复0或1次,可有可无
“{m}”表示前一个字符重复m次。
“{a,b}”表示前一个字符重复a~b次,同时“{,b}”表示0~b,“{a,}”表示a~+inf次。注意大括号中不可包含空格,如“{a, b}”是错误的,应为“{a,b}”。

以上符号默认均为贪婪模式,即匹配尽可能多的字符。如果需匹配尽可能少的字符,可在其后加上“?”符号,如“a*?”为非贪婪模式。

“()”可使重复符号作用于其括住的全部字符上,如“(br)*”指"br"重复0~+inf次

 

 


re模块
基本方法:
“p = re.compile(r"ab*")”编译一个匹配器(正则),r"ab*"为匹配规则的表达式(模式)

“m = p.match("abbcabd")”在"abbcabd"中从第一个字符开始匹配,结果保存在match对象中并返回
“m = p.search("abbcabd")”在"abbcabd"中不断向后查找,只返回第一个最先匹配到的内容
“listAll = p.findall("abbcabd")”在"abbcabd"中不断向后查找所有能匹配的内容,并将其以列表的方式返回
“iterAll = p.finditer("abbcabd")”上一种方式的迭代器版本,迭代时才查找并返回内容

“s = m.group()”或“s = m.group(0)”获得匹配的内容
“s = m.start()”获得匹配内容在字符串中的起始索引值,指向匹配内容的第一个字符
“s = m.end()”获得匹配内容在字符串中的终止索引值,指向匹配内容最后一个字符的后一个字符
“s = m.span()”获得匹配内容在字符串中的范围,元组方式返回,范围为左包含而右不包含的
“print(m)”输出匹配的范围和内容

 

 

分组
在正则表达式中把需要的信息用小括号“()”括起来,即可获得它们,称为分组。如:
“p = re.compile(r"w(w)(w+)")”
“m = p.match("This is Python")”
之后“m.group(1)”可返回第一个分组的内容,即"h"
“m.group(2)”可返回第二个分组的内容,即"is"
以此类推
而“m.group()”或“m.group(0)”依然返回匹配到的所有内容,即 "This"
“m.groups()”可将所有分组内容以元组的方式返回,即("h", "is")

分组编号从左到右,由内而外。如以r"w((w)w+)"匹配"This is Python"则第一个分组内容为 "his",第二个为 "h",groups()得 ("his", "h")。
“1”可指代前面第一个分组匹配到的内容,表示“1”这里必须要再次出现此内容,可用于检测双字(叠词)。如:

p = re.compile(r"(w+)s+1")
print(p.search("Paris in the the spring").group())


得:"the the"。

 

注意:分组后“findall”和“finditer”只返回分组的内容,若有多个分组则将每次匹配到的各分组内容以元组的方式存储在列表中。

 

 

 

更多分组
“(?: ... )”中 " ... " 处输入的表达式匹配后不会被groups()捕获。可用于不重要信息的重复如 r"(?:thes?)*"。称为非捕获组
“(?P...)”可将此分组命名为 "gr" ,之后通过“group("gr")”可获得此分组的内容。称为命名组
同时“(?P=gr)”可指代前面分组名为 "gr" 匹配到的内容,表示“(?P=gr)”这里必须要再次出现此内容。
以上两种表达式的“P”指Python特有。
“m.groupdict()”可返回所有被命名的分组内容,分组名为键(key),分组内容为值(value)
“(?#…)”为注释,可被忽略
“(?(id/name)a|b)”指如果编号为 "id" 的分组或名称为 "name" 的命名组存在,则匹配a表达式,否则匹配b表达式

 


前向断言
“(?=…)”指此处应出现表达式 "..." 所描述的内容,如无则此次匹配失败。匹配成功后,其自身不计入匹配内容,原因是其自身不代表实际字符,即零宽度。这被称为前向肯定断言。如字符串 "What"s that?",若以 r"What"s(?=sth)" 匹配之则得 "What"s",若以 r"What"s(?=sth)sw+[?]$" 匹配之则得 "What"s that?"。

“(?!…)”与上一种相反,指此处不应出现表达式 "..." 所描述的内容,如出现则此次匹配失败。这被称为前向否定断言。可用于排除某种文件后缀,如 r".*[.](?!bat$)[^.]*$" 只可匹配后缀为"bat"

 

 

后向断言
“(?<=…)”为后向肯定断言,与 "(?=...)" 作用基本相同,不计入匹配内容,但其自身可以代表实际字符。如字符串 "It"s spam-egg",若以 r"(?<=-)w+" search之则仍得 "egg"。“(?<=…)”中不可添加重复(s*、a{1, 4}),但可添加其他内容如 "|"

“(?

 


标志
可以在re.compile()中增加匹配标志的参数,相当于对匹配方式进行设置。标志可以叠加,在其之间需加上 "|" 按位与运算符,如:“p.compile(r"ab*, re.M|re.I)”

“re.M”设置MULTILINE模式(多行匹配模式),使 "^" 指示行的开头, "$" 指示行的末尾。也可写为“re.MULTILINE”
“re.I”设置IGNORECASE模式,忽略大小写,即大写既可匹配大写也可匹配小写,小写既可匹配小写也可匹配大写。也可写为“re.IGNORECASE”
“re.L”设置LOCALE模式,方便处理本地所使用的拉丁语言。比如 "é" "ñ" "ç" 对于西班牙语而言只有 "é" "ñ" 是字母,但对于法语而言则只有 "é" "ç" 是字母。未设置re.L时,Python3默认进行 Unicode 匹配,即将 "é" "ñ" "ç" 都识别为字母。设置后,则据地区而定。主要影响 "w" "W" "" "B" 和大小写忽略(re.I)。也可写为“re.LOCALE”
“re.S”设置DOTALL模式,使 "." 可匹配任何字符,包括 " "。也可写为“re.DOTALL”
“re.A”设置ASCII模式,使默认的 Unicode 匹配变为 ASCII 匹配,影响 "w" "W" "" "B" "s" "S" 的工作。也可写为“re.ASCI”
“re.U”设置UNICODE模式,与上一个模式相反,也可写为“re.UNICODE”
“re.X”设置VERBOSE模式,可使正则表达式更易读。设置re.X后,表达式中所有空格都将被忽略,并且允许加入注释,指示各部分的含义,也可写为“re.VERBOSE”,如:

1 charref = re.compile(r"""
2  &[#]                # Start of a numeric entity reference
3  (
4      0[0-7]+         # Octal form
5    | [0-9]+          # Decimal form
6    | x[0-9a-fA-F]+   # Hexadecimal form
7  )
8  ;                   # Trailing semicolon
9 """, re.VERBOSE)

若未设置re.X则写为:

1 charref = re.compile("&#(0[0-7]+"
2                      "|[0-9]+"
3                      "|x[0-9a-fA-F]+);")

设置后空格需以 r" " 表示。

 


模块级函数:
可以不编译匹配器(正则)而直接使用相应函数匹配内容,如:
“m = match(r"ab*", "abbcabd", re.M)”
“m = search(r"ab*", "abbcabd", re.M)”
“listAll = findall(r"ab*", "abbcabd", re.M)”
“iterAll = finditer(r"ab*", "abbcabd", re.M)”
都将表达式放在第一个参数、字符串在第二个参数、标志在第三个参数即可。

 

 

 

正则表达式用于处理字符串的re函数:

“re.split()”可以以正则表达式匹配的内容为分割符,分割字符串。
如:
“p = re.compile(r"W+")”
“listS = p.split("This is short and sweet.")”
结果为:["This", "is", "short", "and", "sweet", ""]

可指定其最大分割次数,如:
“p.split("This is short and sweet.", maxsplit=2)”指split最多分割2两次,
得:["This", "is", "short and sweet."]
也可写为“p.split("This is short and sweet.", 2)”

若正则中有捕获分组,则还将返回捕获分组的内容,如:
“p2 = re.compile(r"(W+)")”
“listS2 = p2.split("This is short and sweet.")”
结果为:["This", " ", "is", " ", "short", " ", "and", " ", "sweet", ".", ""]

 

 

“re.sub()”可将正则在字符串中匹配到的内容替换为另一个内容。
如:
“p = re.compile("(blue|white|red)")”
“s = p.sub("colour", "blue socks and red shoes")”
结果为:"colour socks and colour shoes"

sub()同样可指定最大替换次数,如:
“p.sub("colour", "blue socks and red shoes", count=1)”指sub最多替换1次,
得:"colour socks and red shoes"
也可写为“p.sub("colour", "blue socks and red shoes", 1)”

所替换成的另一个内容中可引用匹配内容中的分组内容,可写为 "1" 或 "g<1>" ,表示引用第一个分组。对于命名组 "(?P...)" 还可写为 "g" ,如:
“p = re.compile("section{ (?P [^}]* ) }", re.X)”
“p.sub(r"subsection{1}","section{First}")”
“p.sub(r"subsection{g<1>}","section{First}")”
“p.sub(r"subsection{g}","section{First}")”
结果均为:"subsection{First}"

还可为sub()传入一个函数,sub()会将匹配到的每一个内容以match对象的方式,传入函数中,然后将匹配的内容替换为函数的返回值。如:
“p = re.compile(r"d+")”
“p.sub(func, "Call 65490 for printing, 49152 for user code.")”
可依次将匹配到的 "65490"、"49152" 作为 match 对象,传入 func 函数。
若 func = lambda m: hex(int(m.group())) ,则得:
"Call 0xffd2 for printing, 0xc000 for user code."
此方法可将字符串中的各个整数替换为16进制数

 


“subn()”的用法与sub()完全相同,但还会返回替换次数,如:
“p = re.compile("(blue|white|red)")”
“s = p.subn("colour", "blue socks and red shoes")”
结果为:("colour socks and colour shoes", 2)

 

 

更多方法/函数
“p.fullmatch()”或“re.fullmatch()”用法与match()一样,但要求正则与字符串必须从头到尾完全匹配,否则返回None。相当于在正则末尾加了一个 ""
“p.flags()”获得匹配器p的所有标志,返回值可直接传入compile()
“p.pattern()”获得匹配器p的正则,以字符串形式返回
“re.escape()”可在字符串中的所有元字符前加 "" ,避免正则转义,如“print(re.escape("https://www.python.org"))”得 "https://www.python.org"
“re.purge()”可清除正则表达式的缓存


“(?...)”也可用于设置标记,放在正则前。如 "(?aiLmsux)^asd&" 可为 "^asd&" 开启 re.A ~ re.X 所有标志。实测效果不太理想。

 

 

 

【例题】

1、 找出一个字符串中所有的数字,其中整数用千分位形式表示,即从个位数起,每3位之间加一个逗号,比如1,000,000,小数用定点十进制表示,并且小数点之前至少有一位数字(比如0.618中的0不可省略)。
如:"1,234.56-234.56=1,000"
返回:["1,234.56", "234.56", "1,000"]

解:

1 s = r"1,234.56-234.56=1,000"
2  
3 p = re.compile(r"(d{1,3}(?:,d{3})*(?:.d+)?)")
4 L = p.findall(s)
5 print(L)

 

 


 

参考:

正则表达式HOWTO — Python 3.10.2 文档

re --- 正则表达式操作 — Python 3.10.4 文档


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了如何通过conda安装Selenium的wheel文件,包括查看环境、卸载旧版本、下载新版本的wheel文件以及安装操作的步骤。同时提供了使用清华源的方法。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
author-avatar
goxtop
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有