码迷,mamicode.com
首页 > 编程语言 > 详细

Python正则表达式

时间:2018-06-30 19:58:13      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:否则   index   traceback   示例   命名   style   oom   std   需要   

  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)(?#现在.也能匹配\n符号了)th.+, ‘‘‘
... The first line
... the second line
... the third line
... ‘‘‘)
>>> r.group()
the second line\nthe third line\n
>>> 

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

  • (?=<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(dog\s+)(?(1)run|fly), dog run))
True
>>> bool(re.search(r(bird\s+)(?(1)fly|run), bird fly))
True
>>> 

 

Python正则表达式

标签:否则   index   traceback   示例   命名   style   oom   std   需要   

原文地址:https://www.cnblogs.com/April01xxx/p/9248340.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!