zoukankan      html  css  js  c++  java
  • python正则表达式(8)--分组、后向引用、前(后)向断言

    无名、有名分组

    (1)正则表达式—无名分组

    从正则表 达式的左边开始看,看到的第一个左括号“(”表示表示第一个分组,第二个表示第二个分组, 依次类推。

    需要注意的是,有一个隐含的全局分组(就是索引号为0的分组),就是整个正则 表达式匹配的结果

    (2)正则表达式—有名分组

    命名分组就是给具体有默认分组编号的组另外再起一个别名,方便以后的引用。 命令分组的语法格式如下: (?P<name>正则表达式)

    语法格式中的字符P必须是大写的“P”,name是一个合法的标识符,表示分组的别名。

    s = "ip='230.192.168.78',version='1.0.0'"

    res = re.search(r"ip='(?P<ip>d+.d+.d+.d+).*", s)

    print res.group('ip')#通过命名分组引用分组

    正则表达式—后向引用

    当用“()”定义了一个正则表达式分组后,正则引擎就会把匹配的组按照顺序进行编号,然后存 入缓存中。这样我们就可以在后面对已经匹配过的内容进行引用,这就叫后向引用。

    (1)通过索引引用

    数字 1表示引用第一个分组,2引用第二个分组,以此类推, 引用第n个组,而则表示引用整个 被匹配的正则表达式本身。

    交换字符串的位置

    import re

    s = 'abc.xyz' # 交换.号两边的字符串

    res = re.sub(r'(.*).(.*)', r'2.1', s)

    print res

    >>>xyz.abc

    (2) (?P=name)通过命名分组名进行引用

    (?P=name) 字符P必须是大写的P,name表示命名分组的分组名

    (?P<name>)(?P=name) 引用分组的值匹配值必须与第一个分组匹配值相等才能匹配到

    例如:

    1)    引用前一个分组,前后值相同都是2,故能匹配到

    >>> re.match(r'(?P<xst>d)(?P=xst)','22').groups()

    ('2',)

    >>> re.match(r'(?P<xst>d)(?P=xst)','22').group()

    '22'

    2)    引用前一个分组,前后值不相同分别为2和3,故不能匹配到

    >>> re.match(r'(?P<xst>d)(?P=xst)','23').group()

    Traceback (most recent call last):

    File "<stdin>", line 1, in <module>

    AttributeError: 'NoneType' object has no attribute 'group'

    正则表达式—前后向断言

    (1)前向肯定断言与后向肯定断言

    1)    前向肯定断言的语法:

    (?<=pattern) 前向肯定断言表示你希望匹配的字符串前面是pattern匹配的内容时,才匹配。

    2)    后向肯定断言的语法:

    (?=pattern) 后向肯定断言表示你希望匹配的字符串的后面是pattern匹配的内容时,才匹配

    3)前后向断言同时使用

    如果在一次匹配过程中,需要同时用到前向肯定断言和后向肯定断 言时,那你必须将前向肯定断言表达式写在要匹配的正则表达式的前面,而后向肯定断言表 达式写在你要匹配的字符串的后面

    (2) 前向否定断言与后向否定断言

    1) 前向否定断言的语法:

    (?<!pattern) 前向否定断言表示你希望匹配的字符串的前面不是pattern匹配的内容时,才匹配.

    2) 后向否定断言的语法:

    (?!pattern) 后向否定断言表示你希望匹配的字符串后面不是pattern匹配的内容时,才匹配。

    (3)注意

    前向肯定(否定)断言括号中的正则表达式必须是能确定长度的正则表达式,比如w{3},而不能写成 w*或者w+或者w?等这种不能确定个数的正则模式符。

  • 相关阅读:
    解析中间人攻击(4/4)---SSL欺骗
    解析中间人攻击(3/4)---会话劫持
    解析中间人攻击(2/4)---DNS欺骗
    解析中间人攻击(1/4)---ARP缓存中毒
    (转)常见的HTTPS攻击方法
    转载 OpenUrl
    如何安全的存储密码
    本地存储密码的安全设计
    硬件断点和软件断点的区别
    网站防止CC攻击的方法
  • 原文地址:https://www.cnblogs.com/zeke-python-road/p/9597655.html
Copyright © 2011-2022 走看看