3.3 引用分组

括号不仅仅能把有联系的元素归拢起来并分组,还有其他的作用——使用括号后,正则表达式会保存每个分组真正匹配的文本,等到匹配完成后,通过group(num)之类的方法“引用”分组在匹配时捕获的内容。其中num表示对应括号的编号,括号分组的编号是从左向右计数,从1开始。因为“捕获”了文本,所以这种功能叫做捕获分组(capturing group)。对应的,这种括号叫做捕获型括号

例3-16 引用捕获分组

print(re.search(r"(\d{4})-(\d{2})-(\d{2})", "2018-12-13").group(1))  # 2018
print(re.search(r"(\d{4})-(\d{2})-(\d{2})", "2018-12-13").group(2))  # 12
print(re.search(r"(\d{4})-(\d{2})-(\d{2})", "2018-12-13").group(3))  # 13

分组的编号从1开始。不过也有编号为0的分组,它是默认存在的,对应整个表达式匹配的文本。在很多语言中,调用group方法,如果不给出参数num,默认就等于调用group(0)

例3-17 编号为0的分组

print(re.search(r"(\d{4})-(\d{2})-(\d{2})", "2018-12-13").group())  # 2018-12-13
print(re.search(r"(\d{4})-(\d{2})-(\d{2})", "2018-12-13").group(0))  # 2018-12-13

有些表达式可能包括嵌套嵌套的括号,但是这都不影响编号:无论括号如何嵌套,分组的编号都是根据开括号的出现顺序来技术的;开括号是从左向右数起的第几个,这个括号分组的编号就是多少。

例3-18 嵌套括号的分组编号

regex = re.compile(r'(((\d{4})-(\d{2}))-(\d{2}))')
print(regex.search("2018-12-13").group(0))  # 2018-12-13
print(regex.search("2018-12-13").group(1))  # 2018-12-13
print(regex.search("2018-12-13").group(2))  # 2018-12
print(regex.search("2018-12-13").group(3))  # 2018
print(regex.search("2018-12-13").group(4))  # 12
print(regex.search("2018-12-13").group(5))  # 13

例3-19 利用分组提取超链接的详细信息(注意处理空白和单双引号)

regex = re.compile(r'<a\s+href\s*=\s*[\'"]?([^\'"\s]+)[\'"]?>([^<]+)</a>')
print(regex.findall('<a href="www.baidu.com">百度一下</a>'))  # [('www.baidu.com', '百度一下')]
print(regex.findall("<a href = 'www.360.com'>360</a>"))  # [('www.360.com', '360')]
print(regex.findall("<a href =https://souhu.com>搜狐</a>"))  # [('https://souhu.com', '搜狐')]

引用分组捕获的文本,不仅用于数据提取,也可以用于替换。比如希望将yyyy-mm-dd格式的日期变为mm/dd/yyyy,就可以使用正则表达式进行替换。

在python中进行正则表达式替换的方法是re.sub(pattern, replacement, string),其中pattern是用来匹配被替换文本的表达式,replacement是要替换成的文本,string是要进行替换操作的字符串(原始字符串)。

例3-21 正则表达式替换

print(re.sub(r'[a-z]', 'a', '1m1n1x'))  # 1a1a1a

replacement中也可以引用分组,形式是\num,其中的num是对应分组的编号。不过,replacement并不是一个正则表达式,而是一个普通字符串。根据字符串中的转义规定,\t是制表符,\n是换行符,\1\2却不是字符串中的合法转义序列,所以也必须指定replacement为原生字符串。

例3-22 在替换中使用分组

regex = re.compile(r"(\d{4})-(\d{2})-(\d{2})")
print(regex.sub(r"\2/\3/\1", "2018-12-13"))  # 12/13/2018
print(regex.sub(r"\1年\2月\3日", "2018-12-13"))  # 2018年12月13日

值得注意的是,如果想在replacement中引用整个表达式匹配的文本,不能使用\0,即便使用原生字符串也不行。因为在字符串中,\0开头的转义序列通常表示用八进制形式表示的字符,\0本身表示ascii字符编码为0的字符。如果一定要引用整个表达式匹配的文本,可以稍加变通,给整个表达式加上一对括号,之后用\1来引用。

例3-23 在替换中,使用\1代替\0

# ASCII编码为0的字符无法显示
print(re.sub(r'(\d{4})-(\d{2})-(\d{2})', '\0', '2018-12-13'))  # ''
print(re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\0', '2018-12-13'))  # ''

# 变通一下
print(re.sub(r'((\d{4})-(\d{2})-(\d{2}))', r'[ \1 ]', '2018-12-13'))  # [ 2018-12-13 ]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 捕获组与反向引用 在正则表达式中,圆括号的一大作用是进行模式分组,而其还有另一个非常重要的作用,即定义捕获组。捕获...
    樱雨楼阅读 1,674评论 0 0
  • 从两圈到十圈 这学期确立了一个小目标——减肥。然而,目标简单得只有两个字,实践起来却很难。开学第一天,就和我的小伙...
    泽芝语阅读 207评论 0 0
  • 难攀高雅附风尘,得心忘我两昆仑。胡马阴山不再度,徒增烦恼几人问?
    昨夜小楼又东风_e59b阅读 482评论 5 8
  • 针对市面上能找到的所有个人管理方法进行了汇总,融合作者自身的亲身经历,写的一篇实战运用说明。对自我管理还没有成型的...
    简单1983阅读 167评论 0 0