Skip to main content

Python 入门基础知识 - 正则表达式 - 使用组

Python 入门基础知识 - 正则表达式 - 使用组

使用组

组允许将正则表达式分解成几个不同的组成部分。在完成匹配和搜索后,可以使用元组编号访问不同部分匹配的内容。

组概述

在正则表达式中以一对圆括号"()"来表示位于其中的内容属于一个组。

例如"(re)+"将匹配"rere","rerere"等多个"re"重复的情况。组在匹配由不同部分组成的一个整体时非常有用。

如电话号码由区号和号码组成,在正则表达式中可以使用两组来进行匹配:一组匹配区号,另外一组匹配后边的号码。

实例演示如下

import re
s = 'Phone No. 010-9876543'
r = re.compile(r'(\d+)-(\d+)')
m = r.search(s)
print(m)
# <_sre.SRE_Match object at 0x1059838b0>

print(m.group(1))
# 010

print(m.group(2))
# 9876543

print(m.groups())
# ('010', '9876543')

在正则表达式中可以通过使用"(?P<组名>)"为组设置一个名字,通过使用如下所示模式,将第一个组的名字设置为"Area",将第二组的名字设置为"No"。

import re
s = 'Phone No. 010-9876543'
r = re.compile(r'(?P<Area>\d+)-(?P<No>\d+)')
m = r.search(s)
print(m.groups())
# ('010', '9876543')

print(m.group(1))
# 010

print(m.group(2))
# 9876543

print(m.groupdict())
# {'Area': '010', 'No': '9876543'}

print(m.group('Area'))
# 010

print(m.group('No'))
# 9876543

组的扩展语法

除了在组中使用"?P<组名>"来命名组名以外,还可以使用以下集中以"?"开头的扩展语法

(?iLmsux) 设置匹配标志,可以是i、L、m、s、u、x以及它们的组合。其含义与编译标志相同。

(?:...) 表示此非一个组

(?P=name) 表示在此之前的名为name的组

(?#...) 表示注释

(?=...) 用于正则表达式之后,表示如果"="后的内容在字符串中出现则匹配,但不返回"="后的内容

(?!...) 用于正则表达式之后,表示如果"!"后的内容在字符串中不出现则匹配,但不返回"!"后的内容

(?<=...) 用于正则表达式之前,与(?=...)含义相同

(?<!...) 用于正则表达式之前,与(?!...)含义相同

实例演示如下

import re
s = '''Life can be good;
Life can be bad;
Life is mostly cheerful;
But sometimes sad.
'''
r = re.compile(r'be(?=\sgood)')  # 编译正则表达式,只匹配其后单词为'good'的'be'
m = r.search(s)
print(m)
# <_sre.SRE_Match object at 0x10625e850>

print(m.span())  # 输出匹配到的单词在字符串的位置
# (9, 11)

print(r.findall(s))
# ['be']

r = re.compile('be')
print(r.findall(s))
# ['be', 'be']

r = re.compile(r'be(?!\sgood)')  # 重新编译,匹配之后的单词不为'good'的'be'
m = r.search(s)
print(m)
# <_sre.SRE_Match object at 0x1007c6238>

print(m.span())
# (27, 29)

r = re.compile(r'(?:can\s)be(\sgood)')  # 使用组来匹配'be good'
m = r.search(s)
print(m)
# <_sre.SRE_Match object at 0x1055b1648>

print(m.groups())
# (' good',)

print(m.group(1))
#  good # good前面是有空格的哦

r = re.compile(r'(?P<first>\w)(?P=first)')  # 使用组名重复,此处匹配具有两个重复字母的单词
print(r.findall(s))
# ['o', 'e']

r = re.compile(r'(?<=can\s)b\w*\b')  # 匹配以字母'b'开头位于'can'之后的单词
print(r.findall(s))
# ['be', 'be']

r = re.compile(r'(?<!can\s)b\w*\b')  # 匹配以字母'b'开头不位于'can'之后的单词
print(r.findall(s))
# ['bad']

r = re.compile(r'(?<!can\s)(?i)b\w*\b')  # 重新编译,忽略大小写
print(r.findall(s))
# ['bad', 'But']

实例环境声明

# _*_ coding: utf-8 -*-
# version 2.7.13


版权声明

版权声明

durban.zhang 创作并维护的 Walkerfree 博客采用 创作共用保留署名-非商业-禁止演绎4.0国际许可证。本文首发于 Walkerfree 博客(http://www.walkerfree.com/),版权所有,侵权必究。本文永久链接:http://www.walkerfree.com/article/54