2. 匹配重复次数的特殊字符

这一小节我们先来学习正则表达式当中用于匹配重复次数的特殊字符。这可以让我们尽快了解什么是正则表达式。

用于匹配重复次数的特殊字符如下:

特殊字符
说明
*
匹配前一个字符 0 次、1 次或多次
+
匹配前一个字符 1 次或多次
?
匹配前一个字符 0 次或 1 次
{n}
匹配前一个字符 固定 n 次
{m,}
匹配前一个字符 至少 m 次
{,n}
匹配前一个字符 最多 n 次
{m,n}
匹配前一个字符 m 到 n 次

下面用示例说明上述特殊字符的用法。

先来创建一个字符串 s1 用来绑定一个字符串如下:。

>>> import re  # 导入 python 的 re 模块
>>> s1 = 'weewiweiweeiweeeiweeeeimingze.com'

请注意观察 s1 绑定的字符串。

使用普通字符匹配

目标1:

找出以 'w' 开头,后面跟有两个 'e' 的全部的字符串,并返回结果。

结果如下:

>>> re.findall(r'wee', s1)
['wee', 'wee', 'wee', 'wee']

在 s1 字符串中一共找到四个,并以列表的形式返回结果。

使用特殊字符匹配重复次数

目标2:

找出以 'w' 开头,以 'i' 结尾,中间有0个、1个或多个 'e' 的全部的字符串,并返回结果。

这时候我们可以使用 '*' 这个特殊字符。'*' 匹配前面的字符出现0次、1次或多次。

结果如下:

>>> re.findall(r'we*i', s1)
['wi', 'wei', 'weei', 'weeei', 'weeeei']

在 s1 字符串中一共找到五个。第一个 'wi' 中间没有 'e' 也可以匹配。

目标3:

找出以 'w' 开头,以 'i' 结尾,中间有1个或多个 'e' 的全部的字符串,并返回结果。

这时候我们可以使用 '+' 这个特殊字符。'+' 匹配前面的字符出现1次或多次。

结果如下:

>>> re.findall(r'we+i', s1)
['wei', 'weei', 'weeei', 'weeeei']

在 s1 字符串中一共找到四个。第一个是 'wei'。此示例中'wee''wi'没有匹配成功。

目标4:

找出以 'w' 开头,以 'i' 结尾,中间有0个或1个 'e' 的全部的字符串,并返回结果。

这时候我们可以使用 '?' 这个特殊字符。'?' 匹配前面的字符出现0次或1次。

结果如下:

>>> re.findall(r'we?i', s1)
['wi', 'wei']

在 s1 字符串中一共找到两个。第一个是 'wi',第二个是 'wei'。其他没有匹配成功。

目标5:

找出以 'w' 开头,以 'i' 结尾,中间有3个 'e' 的全部的字符串,并返回结果。

这时候我们可以使用 '{n}' 这个特殊字符的组合。'{n}' 匹配前面的字符出现固定的n次。

结果如下:

>>> re.findall(r'we{3}i', s1)
['weeei']

在 s1 字符串中一共找到1个'weeei'

当让上述匹配样式'we{3}i' 也可以写成 r'weeei',都是同样的效果。当使用'{n}' 这种方式会更灵活,并可以匹配字符集合(下一节讲解)。

目标6:

找出以 'w' 开头,以 'i' 结尾,中间有1个到3个 'e' 的全部的字符串,并返回结果。

这时候我们可以使用 '{m,n}' 这个特殊字符的组合。'{m,n}' 匹配前面的字符出现最少n次,最多m次的匹配(包含n和m)。

注意: 表达式 '{m,n}' 中间逗号后面没有空格。这个语法非常严格。

结果如下:

>>> re.findall(r'we{1,3}i', s1)
['wei', 'weei', 'weeei']

在 s1 字符串中一共找到3个符合条件的结果。

目标7:

找出以 'w' 开头,以 'i' 结尾,中间有2个或以上个 'e' 的全部的字符串,并返回结果。

这时候我们可以使用 '{m,}' 这个特殊字符的组合。'{m,}' 匹配前面的字符出现最少n次,最多不限制次数的匹配。

结果如下:

>>> re.findall(r'we{2,}i', s1)
['weei', 'weeei', 'weeeei']

在 s1 字符串中一共找到3个符合条件的结果。

目标8:

找出以 'w' 开头,以 'i' 结尾,中间有0个到3个 'e' 的全部的字符串,并返回结果。

这时候我们可以使用 '{,n}' 这个特殊字符的组合。'{,n}' 匹配前面的字符出现最少0次,最多n次的匹配(包含n)。

结果如下:

>>> re.findall(r'we{,3}i', s1)
['wi', 'wei', 'weei', 'weeei']

在 s1 字符串中一共找到4个符合条件的结果。 其中 'wi' 也能成功匹配并找到了。