本章节将介绍正则表达式中很重要的语法分组,有了分组我们可以很容易从字符串中提取我们想要的字符串,也能很方便进行字符串替换。
正则表达式模式中使用圆括号(“()”)对字符进行分组,并保存匹配的文本(保存到内存中)。通常,这些通过圆括号分组的字符都是为了文本操作的目的而建立的。例如:引用某个分组,在后续章节将介绍分组引用。
注意:
在其他一些书籍中也将分组称为“子模式”。子模式指分组中的一个或多个分组。子模式就是模式中的模式。多数情况下,子模式中的条件能得到匹配的前提是前面的模式得到匹配,但也有例外。子模式的写法可以有很多种,下面将主要介绍圆括号中的子模式。例如:
(the|The|THE)
上面模式中,有三个子模式:the 是第一个子模式,The是第二个,而 THE 是第三个。但是这种情况下,匹配第二个模式不依赖于是否匹配第一个模式。但是,最左边的模式会首先匹配。
如果你要创建一个字符组,只需要简单地在需要分组的字符前面加一个圆括号字符,而后面加一个闭括号字符即可。例如:
hello world
上面模式中,只包含直接量字符,这个模式可以用于匹配文本“hello world”。如果我们将上面模式添加分组呢?如下:
(hello)( )(world)
上面模式也会匹配文本“hello world”。不过,它同时还创建了三个分组:
第一个分组中包含字符序列 hello
第二个分组中包含一个空格字符
第三个分组中包含字符序列 world
实例:使用圆括号实现分组,然后引用这些分组。如下:
上图中,模式“(hello)( )(world)”创建了三个分组,分别为 $1、$2 和 $3。其中,$0 表示整个正则表达式。我们可以在正则表达式替换时引用前面的三个分组,如下图:
上图中,我们使用 $3、$2 和 $1分别引用第三个、第二个和第一个分组。替换后,将字符串“hello world”转换成“world hello”字符串。
注意:当在模式中使用圆括号时,要注意圆括号里不能包含任何空白字符(如果你需要匹配空白,则可以包含空白,此时的空白字符对你来说是有实际意义的)。因为如果包含了空白字符,正则表达式引擎会将这个空白字符作为字符序列的一部分来处理。而如果没有找到匹配的空白字符,便会导致匹配失败。
上面介绍了圆括号 “()” 分组的用法,如果我们匹配的文本中本身就包含了圆括号字符呢?例如,匹配座机号码,如下:
(028)87762345
由于圆括号 “()” 是正则表达式的元字符;如果要匹配圆括号普通字符,可以使用转义符 “\”。可以用下面的模式匹配上面文本:
\([\d{3}]\)\d{7,}
正则表达式允许对分组进行命名,但是在不同的语言环境分组命名语法不一致。
在 Python 和 .NET 语言中可以创建命名的组。.NET 中相应的语法是:
(?<组名>模式)
或
(?'组名'模式)
而 Python 中相应的语法是:
(?P<组名>模式)
因此,如果有以下形式的数据:
Temperature:28.7
并希望将捕获的温度保存在命名变量 tmp 中,那么可以使用下面的模式:
Temperature:(?<tmp>\d{2}\.\d)
如下图: