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?等这种不能确定个数的正则模式符。

  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/zeke-python-road/p/9597655.html
Copyright © 2011-2022 走看看