2019独角兽企业重金招聘Python工程师标准>>>

Python 2.7的手册中的解释:

(?P<name>...)

Similar to regular parentheses, but the substring matched by the group is accessible within the rest of the regular expression via the symbolic group name name. Group names must be valid python identifiers, and each group name must be defined only once within a regular expression. A symbolic group is also a numbered group, just as if the group were not named. So the group named id in the example below can also be referenced as the numbered group 1.

For example, if the pattern is (?P<id>[a-zA-Z_]\w*), the group can be referenced by its name in arguments to methods of match objects, such asm.group('id') or m.end('id'), and also by name in the regular expression itself (using (?P=id)) and replacement text given to .sub() (using \g<id>).

此处详细解释一下上述原文的意思:

声明:此处尽量称 group为“group”,而不翻译为 汉字的“组”,以便容易理解和去强化group本身的组的含义。

1.此处的(?P<name>…),和普通的(?…):

【教程】详解Python正则表达式之: (…) group 分组

基本类似。区别在于,此处由于是给此group命名了,所以,后续(同一正则表达式内和搜索后得到的Match对象中),都可以通过此group的名字而去引用此group。

2. group的名字,当前需要是正常的Python标识符,即字母,数字,下划线等,即,没有特殊的字符。

3.同一正则表达式内,每个group的组名,是唯一的,不能重复。

4. 虽然此处group内命名了,但是其仍然和普通的

【教程】详解Python正则表达式之: (…) group 分组

中一样,可以通过索引号,即group(1),group(2)等等,去引用对应的group的。

很明显,按照正则内被命名的group的顺序,依次地

group(1)==group(name1)

group(2)==group(name2)

….

下面就整理出示例代码,用于演示,named group的用法,其中也包括了,相对要复杂一点的:

(1)命了名的group,在当前的正则表达式中,后续被(?P=name)的方式引用;

其中,详细注意事项,可参考:

【教程】详解Python正则表达式之: (?P=name) match earlier named group 匹配前面已命名的组

(2)re.sub()中后续通过\g<name>方式被引用。

示例代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

#!/usr/bin/python

# -*- coding: utf-8 -*-

"""

【教程】详解Python正则表达式之: (?P<name>...) named group 带命名的组

http://www.crifan.com/detailed_explanation_about_python_named_group

Version:    2012-11-12

Author:     Crifan

"""

import re;

#如下教程所举例的代码,已去除重复的,关于group本身的解释。

#所以,请在参考学习下面代码之前,请确保已经对group的用法有所了解。

#如不了解,可参考:

#【教程】详解Python正则表达式之: (…) group 分组

#http://www.crifan.com/detailed_explanation_about_python_regular_express_about_group/

# 下列举例所用的字符串是来自于 http://janexyy.blogbus.com/logs/105359907.html 中的部分html代码

# 此处所采用的示例代码,参考自:

#http://code.google.com/p/blogs-to-wordpress/source/browse/trunk/libs/crifan/blogModules/BlogBlogbus.py

# -> extractTags()

reNamedGroupTestStr = u'标签:<a href="/tag/情侣电话粥/">情侣电话粥</a>';

# 1. (?P=name)

# 此处就是通过 (?P=name)的方式,来引用,正则表达式中,前面已经命名tagName的group的

foundTagA = re.search(u'.+?<a href="/tag/(?P<tagName>.+?)/">(?P=tagName)</a>', reNamedGroupTestStr);

print "foundTagA=",foundTagA; #foundTagA= <_sre.SRE_Match object at 0x00876D60>

if(foundTagA):

    # 2. mateched.group(name)

    # 可以通过之前给group命的名,来获得匹配到的值

    namedGroupStr = foundTagA.group("tagName");

    print "namedGroupStr=",namedGroupStr; #namedGroupStr= 情侣电话粥

    # 3. matched.group(N) == matched.group(name)

    # 此处,通过group的index,即group(1),group(2),...

    # 也可以获得和之前通过名字name获得的group的值

    # 通过名字或者索引号,两种方式都可以获得所需要的值,

    # 但是通过名字,更加准确,不会出现,当group太多而index容易混淆的问题

    group1Value = foundTagA.group(1);

    print "Group(1): group1Value=",group1Value; #Group(1): group1Value= 情侣电话粥

    

    # 4. \g<name> in re.sub()

    # 在re.sub()中,通过\g<name>的方式,引用前面已经命名为name的group的值

    substitutedStr = re.sub(u'.+?<a href="/tag/(?P<tagName>.+?)/">(?P=tagName)</a>', u'所捕获的tag值为:\g<tagName>', reNamedGroupTestStr);

    print "Original string=%s, after substituted=%s"%(reNamedGroupTestStr, substitutedStr); #Original string=标签:<a href="/tag/情侣电话粥/">情侣电话粥</a>, after substituted=所捕获的tag值为:情侣电话粥

【总结】

1. 一般多数是通过matched.group(name)的方式去获得对应所查找到的字符串的。

2. 关于匹配之前已经出现的字符串,可以使用:

(1)在re.search等中,使用(?P=name);

(2)在re.sub的被替换的字符串中,使用\g<name>的方式获得之前已命名的group的值;

转载于:https://my.oschina.net/u/3157270/blog/1492637

详解Python正则表达式之: (?Pname…) named group 带命名的组相关推荐

  1. python 正则表达式 断言 不定长表达式_【教程】详解Python正则表达式之: (?!…) negative lookahead assertion 前向否定匹配 /前向否定断言...

    Python 2.7的官网文档中的解释是:(?!...)Matches if ... doesn't match next. This is a negative lookahead assertio ...

  2. 详解Python正则表达式中group与groups的用法

    在Python中,正则表达式的group和groups方法是非常有用的函数,用于处理匹配结果的分组信息. group方法是re.MatchObject类中的一个函数,用于返回匹配对象的整个匹配结果或特 ...

  3. python中re模块的span,详解Python正则表达式re模块

    正则是处理字符串最常用的方法,我们编码中到处可见正则的身影. 正则大同小异,python 中的正则跟其他语言相比略有差异: 1.替换字符串时,替换的字符串可以是一个函数 2.split 函数可以指定分 ...

  4. 详解Python正则表达式(含丰富案例)

    前言:正则表达式在网络爬虫.数据分析中有着广泛使用,掌握正则表达式能够达到事半功倍的效果.本文详细介绍正则表达式中各种规则及其符号含义,并结合Python中的Re库进行演示,由浅入深,即学即练即用,内 ...

  5. python re.compile() 详解——Python正则表达式

    1 概述 当我们在Python中使用正则表达式时,re模块内部会干两件事情: 编译正则表达式,如果正则表达式的字符串本身不合法,会报错: 用编译后的正则表达式去匹配字符串. 那么如果一个正则表达式要重 ...

  6. 【整理】Python中的re.search和re.findall之间的区别和联系 + re.finall中带命名的组,不带命名的组,非捕获的组,没有分组四种类型之间的区别

    之前自己曾被搞晕过很多次. 后来使用这些函数次数多了之后,终于比较清楚的弄懂了两者之间的区别和关系了. 尤其是一些细节方面的注意事项了. 在看下面的总结和代码之前,请先确保你对如下基本概念已经有所了解 ...

  7. python变量定义大全_详解python变量与数据类型

    这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...

  8. python模式匹配算法_详解Python 最短匹配模式

    问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配. 而你想修改它变成查找最短的可能匹配. 解决方案 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字 ...

  9. python正则匹配空格+数字+空格_详解Python中正则匹配TAB及空格的小技巧

    详解Python中正则匹配TAB及空格的小技巧 发布时间:2020-10-15 08:38:48 来源:脚本之家 阅读:94 作者:杰瑞26 在正则中,使用.*可以匹配所有字符,其中.代表除\n外的任 ...

最新文章

  1. linux 删除小于、大于固定大小的文件
  2. Python学习之路 拓展篇 Pychram的应用
  3. windows 7开启telnet功能
  4. Bound Found POJ - 2566(尺取法)
  5. java分页的工具类,java分页工具类
  6. 如何将heic格式转化jpg?
  7. Python如何将多个MP4软件合并为1个MP4?
  8. 小伙利用C++打造QQ登录器,成功获得称赞
  9. PostgreSQL 大会与DBA培训交流记录
  10. android P-sensor (Proximity Sensor)
  11. 见证一张CAD图如何蜕变成一个高大上的三维地形模型(一)
  12. python动画篮球大小_用Python把蔡徐坤打篮球视频转换成字符动画!
  13. Google Chrome源码剖析
  14. 成功 自信 快乐, ――给中国青年学生的一封信
  15. 计算机组成与设计:指令-计算机的语言
  16. C/C++编程新手入门基础系列:俄罗斯方块小游戏制作源代码
  17. uni-app的uni-ui组件使用
  18. 有刷电机驱动专题-Mos管驱动电路中增加二极管的作用
  19. react-前端excel 文件/PDF文件 导入 --导出、照片上传、mp4格式视频下载
  20. 刷脸支付让城市真正迈入智能化数字化新阶段

热门文章

  1. Zend Framework 入门(1)—快速上手
  2. 7种最有效的懒人减肥方法,收藏了!
  3. Welcome to NHibernate
  4. 开启 ASA 5505 snmp协议
  5. 经典排序 —— 选择排序
  6. Node.js---02、node.js 模块加载机制
  7. Scrum联盟的新任全球营销副总裁访谈
  8. zw版【转发·台湾nvp系列Delphi例程】HALCON HighpassImage
  9. 使用lvs实现负载均衡(V2.0)
  10. Q114:阅读PBRT-V3官方源代码的正确姿势