April01xxx

导航

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)(?#现在.也能匹配\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(r'google(?=.com)', 'www.google.com'))
True
>>> bool(re.search(r'google(?=.com)', 'www.google.coom'))
False
>>> 
  • (?!<pattern>)

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

>>> import re
>>> bool(re.search(r'google(?!.com)', 'www.google.com'))
False
>>> bool(re.search(r'google(?!.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
>>> 

 

posted on 2018-06-30 18:43  April01xxx  阅读(123)  评论(0编辑  收藏  举报