Python re模块 —— 从零基础开始入门正则表达式

简介: Python re模块 —— 从零基础开始入门正则表达式

此模块提供与Perl中类似的正则表达式匹配操作。


要搜索的模式和字符串都可以是Unicode字符串(str)以及8位字符串(字节)。但是,Unicode字符串和8位字符串不能混合:也就是说,不能将Unicode字符串与字节模式匹配,反之亦然;类似地,当请求替换时,替换字符串必须与模式和搜索字符串的类型相同。


正则表达式使用反斜杠字符('\')来表示特殊形式,或者允许在不调用特殊含义的情况下使用特殊字符。这与Python在字符串文本中使用相同的字符来实现相同的目的相冲突;例如,要匹配文本反斜杠,可能必须将“\\\\\”写入模式字符串,因为正则表达式必须是\\,并且每个反斜杠必须在正则Python字符串文本中表示为\\。另外,请注意Python在字符串文本中使用反斜杠的任何无效转义序列现在都会生成一个DeprecationWarning,将来它将成为一个SyntaxError。即使它是正则表达式的有效转义序列,也会发生这种行为。


解决方案是将Python的原始字符串表示法用于正则表达式模式;在前缀为“r”的字符串文本中,反斜杠不会以任何特殊方式处理。所以r“\n”是一个包含“\”和“n”的双字符字符串,而“\n”是一个包含换行符的单字符字符串。通常,模式将使用这个原始字符串表示法在Python代码中表示。


需要注意的是,大多数正则表达式操作都可以作为模块级函数和已编译正则表达式的方法使用。这些函数是快捷方式,不需要您首先编译regex对象,但会丢失一些微调参数。


第三方regex模块,它有一个与标准库re模块兼容的API,但是提供了额外的功能和更全面的Unicode支持。


>>> import re
>>> dir(re)
['A', 'ASCII', 'DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 
'Match', 'Pattern', 'RegexFlag', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 
'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__cached__', '__doc__', 
'__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_cache', 
'_compile', '_compile_repl', '_expand', '_locale', '_pickle', '_special_chars_map', 
'_subx', 'compile', 'copyreg', 'enum', 'error', 'escape', 'findall', 'finditer', 
'fullmatch', 'functools', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 
'sub', 'subn', 'template']
>>> re.__all__
['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 
'purge', 'template', 'escape', 'error', 'Pattern', 'Match', 'A', 'I', 'L', 'M', 'S', 'X', 
'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']




查找匹配函数实例


re.search() 查找第一个匹配串


原型:re.search(pattern, string, flags)


   第一个参数是正则表达式,如果匹配成功,则返回一个Match,否则返回一个None;

   第二个参数表示要匹配的字符串;

   第三个参数是匹配方式标记。


>>> import re
>>> strL='1:Java 2:Python 3:C++ 4:Delphi 5:Vba'
>>> str1='Python'
>>> r=re.search(str1,strL)
>>> r
<re.Match object; span=(9, 15), match='Python'>
>>> r.span()
(9, 15)
>>> strL[9:15]==str1
True
>>> 


re.match() 从串首开始匹配到第一个匹配串

原型:re.match(pattern, string, flags) 参数说明与search()的相同

>>> import re
>>> strL='1:Java 2:Python 3:C++ 4:Delphi 5:Vba'
>>> r=re.match(str1,strL)
>>> r
>>> str2='1.Java'
>>> r=re.match(str2,strL)
>>> r
<re.Match object; span=(0, 6), match='1:Java'>
>>> r.span()
(0, 6)
>>> r.span()[0]==0
True
>>> strL[0:6]==str2
True
>>>



search()和match() 的区别

后者只从字串的第一个字符开始匹配,即它的非None返回值的span()[0]恒等于0。

>>> help(re.match)
Help on function match in module re:
match(pattern, string, flags=0)
    Try to apply the pattern at the start of the string, returning
    a Match object, or None if no match was found.
>>> help(re.search)
Help on function search in module re:
search(pattern, string, flags=0)
    Scan through string looking for a match to the pattern, returning
    a Match object, or None if no match was found.



re.Match类、方法

.span().group() .groups() ...

class Match(builtins.object)
   The result of re.match() and re.search().
   Match objects always have a boolean value of True.
Methods defined here:
span(self, group=0, /)
    For match object m, return the 2-tuple (m.start(group), m.end(group)).
group(...)
     group([group1, ...]) -> str or tuple.
     Return subgroup(s) of the match by indices or names.
     For 0 returns the entire match.
groups(self, /, default=None)
     Return a tuple containing all the subgroups of the match, from 1.
     default
     Is used for groups that did not participate in the match.
...... ......


实例:

>>> import re
>>> from urllib import request
>>> data=request.urlopen("http://www.baidu.com/").read().decode()
>>> pat=r'<title>(.*?)</title>'
>>> result=re.search(pat,data)
>>> result
<re.Match object; span=(940, 964), match='<title>百度一下,你就知道</title>'>
result.span()
(940, 964)
>>> result.group()
'<title>百度一下,你就知道</title>'
>>> result.groups()
('百度一下,你就知道',)



flags 匹配方式标记参数

用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。


   A  ASCII                对于字符串模式,使\w、\w、\b、\b、\d、\d匹配相应的ASCII字符类别(而不是整个Unicode类别,这是默认设置)。

   I  IGNORECASE  对于字节模式,此标志是唯一可用的行为,无需指定。

   L  LOCALE           执行不区分大小写的匹配。

   M  MULTILINE     使\w、\w、\b、\b依赖于当前区域设置。

                                “^”匹配行的开头(换行后)以及字符串。

                                “$”匹配行的结尾(在换行之前)以及字符串的结尾。

   S DOTALL          “.”完全匹配任何字符,包括换行符。

   X VERBOSE      忽略空白和注释以获得更好看的RE。

   U UNICODE       仅用于兼容性。忽略字符串模式(这是默认值),禁止字节模式


注:每个标记参数都有一个全称和一个单个字母的简称: re.A==re.ASCII,

re.I==re.IGNORECASE,...;且A、 L和U是互斥的。除purge和escape之外的每个函数都可以采用可选的“flags”参数由以上一个或多个模块常数组成,并用“|”连接。



flags参数实例:

>>> import re
>>> strL='1:Java 2:Python 3:C++ 4:Delphi 5:Vba'
>>> str3='1:java'
>>> r=re.match(str3,strL)
>>> r
>>> #默认标记为re.A区分大小写,所以匹配不到返回None
>>> r=re.match(str3,strL,re.I)
>>> r
<re.Match object; span=(0, 6), match='1:Java'>
>>> #第三个参数使用re.I标记,就能忽略大小写进行匹配



问题引入:


以上实例中都是查找或匹配单个字串,这种任务字符串本身就有操作函数,如:strL.find('Python')。

如果要找一类符合某个特征的子串,字符串方法.find()就力不从心了,要用其他代码辅助才能实现。

一个简单的类比,就如文件中可以用通用符*和?一样,dir A*.txt 列出A字母开头的所有文本文件。


问题一:列出字符串strL中的数字

 

 

未完待续。。。持续更新中...



目录
相关文章
|
15天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
16天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
46 11
|
13天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
13天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
13天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
3天前
|
设计模式 缓存 开发者
Python中的装饰器:从入门到实践####
本文深入探讨了Python中强大的元编程工具——装饰器,它能够以简洁优雅的方式扩展函数或方法的功能。通过具体实例和逐步解析,文章不仅介绍了装饰器的基本原理、常见用法及高级应用,还揭示了其背后的设计理念与实现机制,旨在帮助读者从理论到实战全面掌握这一技术,提升代码的可读性、可维护性和复用性。 ####
|
4天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
12天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
24 3
|
15天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
36 5
|
16天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
下一篇
无影云桌面