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中的数字

 

 

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



目录
相关文章
|
2月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
74 4
|
1月前
|
Python
Python Internet 模块
Python Internet 模块。
125 74
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
130 63
|
2月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
2月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
17天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
26 3
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
2月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
56 5
|
2月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
47 0
|
2月前
|
JavaScript 前端开发 Python
python中的platform模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术,助你成长。关注我,持续更新中!🎉🎉🎉
37 0

热门文章

最新文章