翼度科技»论坛 编程开发 python 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
引言

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

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

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

示例1
  1. import re

  2. str1 = 'abc\tdefghi\txyz'
  3. print(re.search('(?=\t)', str1))
  4. """
  5. result:
  6. <re.Match object; span=(3, 3), match=''>
  7. """
复制代码
可以看到,它匹配到了索引值为
  1. 3
复制代码
  1. \t
复制代码
字符,但是由于它是前视断言,即向前搜索,而我们的匹配项中
  1. (?=\t)
复制代码
之前并没有任何字符,因此什么也没有匹配到。

示例2

我们对示例
  1. 1
复制代码
中的匹配内容稍作更改。
  1. import re

  2. str1 = 'abc\tdefghi\txyz'
  3. print(re.search('abc(?=\t)', str1))
  4. """
  5. result:
  6. <re.Match object; span=(0, 3), match='abc'>
  7. """
复制代码
此时可以看到,匹配到了字符串
  1. abc
复制代码


示例3
  1. (?<=...)
复制代码
表示如果
  1. ...
复制代码
的匹配内容出现在当前位置的左侧,则匹配。这叫做 肯定型后视断言
  1. (positive lookbehind assertion)
复制代码
  1. (?<=abc)def
复制代码
将会在
  1. abcdef
复制代码
中找到一个匹配,因为后视会回退
  1. 3
复制代码
个字符并检查内部表达式是否匹配。内部表达式(匹配的内容)必须是固定长度的,意思就是
  1. abc
复制代码
  1. a|b
复制代码
是允许的,但是
  1. a*
复制代码
  1. a{3,4}
复制代码
不可以。注意,以肯定型后视断言开头的正则表达式,匹配项一般不会位于搜索字符串的开头。
上面的解释比较抽象,那么具体是什么意思呢?我们看一个例子。
  1. import re

  2. str1 = 'abc\tdefghi\txyz'
  3. print(re.search('(?<=\t)def', str1))
  4. """
  5. result:
  6. <re.Match object; span=(4, 7), match='def'>
  7. """
复制代码
程序先找到
  1. def
复制代码
字符串,然后再回退一个字符查看
  1. def
复制代码
前面的字符是否是
  1. \t
复制代码
字符,如果是,那么就匹配
  1. def
复制代码
字符串。

示例4

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

  2. str1 = 'abc\tdefghi\txyz'
  3. print(re.search('\t(.*)\t', str1))
  4. """
  5. result:
  6. <re.Match object; span=(3, 11), match='\tdefghi\t'>
  7. """
复制代码
可以看到,此时,结果中包含了两端的
  1. \t
复制代码
字符,但是我们不想要它包含
  1. \t
复制代码
字符。为了实现这一目标,我们可以采用刚才我们提到的后视和前视。
  1. import re

  2. str1 = 'abc\tdefghi\txyz'
  3. print(re.search('(?<=\t).*(?=\t)', str1))
  4. """
  5. result:
  6. <re.Match object; span=(4, 10), match='defghi'>
  7. """
复制代码
可以看到我们匹配到了两个
  1. \t
复制代码
字符中间的字符串,但是上述写法并不严谨,为了严谨,我们可以使用:
  1. import re

  2. str1 = 'abc\tdefghi\txyz'
  3. print(re.search('(?<=\t)(.*)(?=\t)', str1))
  4. """
  5. result:
  6. <re.Match object; span=(4, 10), match='defghi'>
  7. """
复制代码
到此这篇关于Python 正则表达式(?=...)和(?<=...)符号的使用的文章就介绍到这了,更多相关Python ?=... ?<=... 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/python/320860ihi.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具