Python正则表达式

Posted april01xxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python正则表达式相关的知识,希望对你有一定的参考价值。

  Python正则表达式中扩展表示法一时间难以完全消化,将自己的理解记录在此.扩展表达式是一种形如(?<pattern>)的模式,根据<pattern>的不同实现不同的语义,具体有以下几种:

正则表达式模式示例 说明
(?:w+.) 匹配冒号后的表达式,本例是匹配一个以.结尾的字符串,匹配的子组不会保存
(?#comment) 此处不匹配,只是作为注释
(?=.com) 正向前视断言,本例表达的含义是:要匹配的内容后面紧跟着的是.com
(?!.com) 负向前视断言,本例表达的含义是:要匹配的内容后面紧跟着的不是.com
(?<=http[s]?) 正向后视断言,本例表达的含义是:要匹配的内容前面是http或https
(?<!http[s]?)

负向后视断言,本例表达的含义是:要匹配的内容前面不是http或https 

(?(1)apple|orange)

条件断言,本例表达的含义是:如果匹配的第一个子组存在则匹配apple,否则匹配orange

此外还可以通过(?P<name>)的形式给子组命名,后续采用(?P=name)的方式引用之前保存的子组.默认情况下匹配的子组是数字顺序编号的.

  • (?:<pattern>)实例

匹配字符串中的.com:

>>> import re
>>> re.search(r(?:.com), www.google.com)
<_sre.SRE_Match object at 0x11004cb90>
>>> re.search(r(?:.com), www.google.com).group()
.com
>>> re.search(r(?:.com), www.google.com).group(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group

匹配成功后使用group(1)方法获取子组失败,这就是该模式的特殊之处,不会保存匹配的子组,也就意味着不能和条件断言一起使用,因为条件断言中需要引用之前匹配到的子组.

  • (?#comment)

注释,主要为了增加正则表达式的易读性:

>>> import re
>>> r = re.search(r(?s)(?#现在.也能匹配
符号了)th.+, ‘‘‘
... The first line
... the second line
... the third line
... ‘‘‘)
>>> r.group()
the second line
the third line

>>> 

注释中的内容在匹配时会忽略.

  • (?=<pattern>)

正向前视断言,通俗点说就是要求待匹配的内容后面是<pattern>,例如以下两个字符串:

www.google.com

www.google.coom

要匹配google后面紧跟着.com的字符串可以这样写:

>>> import re
>>> bool(re.search(rgoogle(?=.com), www.google.com))
True
>>> bool(re.search(rgoogle(?=.com), www.google.coom))
False
>>> 
  • (?!<pattern>)

负向前视断言,判断要匹配的内容后面不是<pattern>,例如:

>>> import re
>>> bool(re.search(rgoogle(?!.com), www.google.com))
False
>>> bool(re.search(rgoogle(?!.com), www.google.coom))
True
>>> 
  • (?<=<pattern>)

正向后视断言,要求待匹配的内容前面是<pattern>,例如要求匹配google前面是https://而不是http://:

>>> import re
>>> bool(re.search(r(?<=https://)google, https://google.com))
True
>>> bool(re.search(r(?<=https://)google, http://google.com))
False
>>> 
  • (?<!<pattern>)

负向后视断言,要求待匹配的内容前面不是<pattern>,例如要求google前面不是http://:

>>> import re
>>> bool(re.search(r(?<!http://)google, http://google.com))
False
>>> bool(re.search(r(?<!http://)google, https://google.com))
True
>>> 
  • (?(N)A|B)

条件断言,如果子组N存在,则匹配A,否则匹配B.举个例子,如果是狗(dog),只能跑(run);如果是鸟(bird),只能飞(fly):

>>> import re
>>> bool(re.search(r(dogs+)(?(1)run|fly), dog run))
True
>>> bool(re.search(r(birds+)(?(1)fly|run), bird fly))
True
>>> 

 

以上是关于Python正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

python 正则表达式

python成长之路第三篇_正则表达式

python成长之路第三篇_正则表达式

python 正则表达式 re模块基础

Python学习笔记之正则表达式

python基础学习(十三)