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(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‘(dogs+)(?(1)run|fly)‘, ‘dog run‘)) True >>> bool(re.search(r‘(birds+)(?(1)fly|run)‘, ‘bird fly‘)) True >>>
以上是关于Python正则表达式的主要内容,如果未能解决你的问题,请参考以下文章