Python 正则表达式(?=...)和(?<=...)符号的使用

 更新时间:2024年05月10日 09:14:05   作者:勤奋的大熊猫  
本文主要介绍Python 正则表达式(?=...)和(?<=...)符号的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引言

今天遇到了一个比较棘手的问题,于是终于打算要对正则表达式中的 (?=...) 和 (?<=...) 符号动手了。

正文

(?=...) 表示当  匹配时,匹配成功,但不消耗字符串中的任何字符。这个叫做 前视断言 (lookahead assertion)。比如, Isaac (?=Asimov) 将会匹配 Isaac ,仅当其后紧跟 Asimov

在之前的介绍中,为什么要使用 () 符号以及 ... 符号的含义。事实上,上述的 (?=...) 与 (?<=...) 中的 ... 符号可以被替换为任意的符号,这里为了方便说明问题,我们将 ... 符号替换为 \t 符号。

示例1

import re

str1 = 'abc\tdefghi\txyz'
print(re.search('(?=\t)', str1))
"""
result:
<re.Match object; span=(3, 3), match=''>
"""

可以看到,它匹配到了索引值为 3 的 \t 字符,但是由于它是前视断言,即向前搜索,而我们的匹配项中 (?=\t) 之前并没有任何字符,因此什么也没有匹配到。

示例2

我们对示例 1 中的匹配内容稍作更改。

import re

str1 = 'abc\tdefghi\txyz'
print(re.search('abc(?=\t)', str1))
"""
result:
<re.Match object; span=(0, 3), match='abc'>
"""

此时可以看到,匹配到了字符串 abc

示例3

(?<=...) 表示如果 ... 的匹配内容出现在当前位置的左侧,则匹配。这叫做 肯定型后视断言 (positive lookbehind assertion)。 (?<=abc)def 将会在 abcdef 中找到一个匹配,因为后视会回退 3 个字符并检查内部表达式是否匹配。内部表达式(匹配的内容)必须是固定长度的,意思就是 abc 或 a|b 是允许的,但是 a* 和 a{3,4} 不可以。注意,以肯定型后视断言开头的正则表达式,匹配项一般不会位于搜索字符串的开头。

上面的解释比较抽象,那么具体是什么意思呢?我们看一个例子。

import re

str1 = 'abc\tdefghi\txyz'
print(re.search('(?<=\t)def', str1))
"""
result:
<re.Match object; span=(4, 7), match='def'>
"""

程序先找到 def 字符串,然后再回退一个字符查看 def 前面的字符是否是 \t 字符,如果是,那么就匹配 def 字符串。

示例4

如果我们想要匹配两个 \t 字符中间的部分怎么办呢?

import re

str1 = 'abc\tdefghi\txyz'
print(re.search('\t(.*)\t', str1))
"""
result:
<re.Match object; span=(3, 11), match='\tdefghi\t'>
"""

可以看到,此时,结果中包含了两端的 \t 字符,但是我们不想要它包含 \t 字符。为了实现这一目标,我们可以采用刚才我们提到的后视和前视。

import re

str1 = 'abc\tdefghi\txyz'
print(re.search('(?<=\t).*(?=\t)', str1))
"""
result:
<re.Match object; span=(4, 10), match='defghi'>
"""

可以看到我们匹配到了两个 \t 字符中间的字符串,但是上述写法并不严谨,为了严谨,我们可以使用:

import re

str1 = 'abc\tdefghi\txyz'
print(re.search('(?<=\t)(.*)(?=\t)', str1))
"""
result:
<re.Match object; span=(4, 10), match='defghi'>
"""

到此这篇关于Python 正则表达式(?=...)和(?<=...)符号的使用的文章就介绍到这了,更多相关Python ?=... ?<=... 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • python抓取搜狗微信公众号文章

    python抓取搜狗微信公众号文章

    这篇文章主要为大家详细介绍了python抓取搜狗微信公众号文章,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • flask模块之session()方法实现

    flask模块之session()方法实现

    Flask的session基于Werkzeug实现,用于在请求间存储用户状态,文章详细介绍了session的赋值、取值、删除、校验及配置等操作,感兴趣的可以了解一下
    2026-01-01
  • Django使用HttpResponse返回图片并显示的方法

    Django使用HttpResponse返回图片并显示的方法

    今天小编就为大家分享一篇Django使用HttpResponse返回图片并显示的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 可视化pytorch 模型中不同BN层的running mean曲线实例

    可视化pytorch 模型中不同BN层的running mean曲线实例

    这篇文章主要介绍了可视化pytorch 模型中不同BN层的running mean曲线实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python梯度下降法的简单示例

    python梯度下降法的简单示例

    这篇文章主要为大家详细介绍了Python梯度下降法的简单示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • python采用getopt解析命令行输入参数实例

    python采用getopt解析命令行输入参数实例

    这篇文章主要介绍了python采用getopt解析命令行输入参数实例,非常具有实用价值,需要的朋友可以参考下
    2014-09-09
  • 一文带你掌握Python Seaborn数据可视化高级篇

    一文带你掌握Python Seaborn数据可视化高级篇

    这篇文章主要为大家详细介绍了如何使用 Seaborn 创建复合图形,如网格图、因子图和聚类热图等,文中示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2023-07-07
  • Python imutils 填充图片周边为黑色的实现

    Python imutils 填充图片周边为黑色的实现

    今天小编就为大家分享一篇Python imutils 填充图片周边为黑色的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python OpenCV 针对图像细节的不同操作技巧

    Python OpenCV 针对图像细节的不同操作技巧

    这篇文章主要介绍了Python OpenCV 针对图像细节的不同操作,包括图像像素的说明,图像属性信息的获取与修改以及图像通道的知识(包括拆分通道和合并通道),需要的朋友可以参考下
    2021-08-08
  • opencv 形态学变换(开运算,闭运算,梯度运算)

    opencv 形态学变换(开运算,闭运算,梯度运算)

    这篇文章主要介绍了opencv 形态学变换(开运算,闭运算,梯度运算),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论