3. 匹配一个字符集合的特殊字符

用于匹配一个字符集合的特殊字符如下:

特殊字符
说明
[abc]
匹配 abc 中的任意一个字符。
[^abc]
匹配不在 abc 中的任意字符(否定匹配)。
[a-z]
匹配任意小写字母(范围匹配)。
[0-9A-F]
匹配十六进制字符(组合范围)。
.
匹配任意单个字符(除换行符 '\n' 外,除非启用 DOTALL 模式)。
\d
匹配数字(等价于 [0-9])。
\D
匹配非数字(等价于 [^0-9])。
\w
匹配单词字符(字母、数字、下划线以及中文,等价于 [a-zA-Z0-9_])。
\W
匹配非单词字符(如标点、空格等)。
\s
匹配空白字符(空格、换行符 '\n'、回车符'\r'、水平制表符 '\t'、垂直制表符 '\v'、 换页符 '\f' 等不可见的控制字符)。
\S
匹配非空白字符

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

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

>>> import re
>>> s2 = 'wazwbzwcz wdz wmz w1z w8z w666z w z wAz'

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

目标1:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是 'a''d' 的全部的字符串,并返回结果。

这时候我们可以使用 [字符集] 这个特殊字符的组合。字符集可以是任意的普通字符。表示当前原字符串中要匹配的字符是字符集中的字符之一则匹配成功。

结果如下:

>>> re.findall(r'w[ad]z', s2)
['waz', 'wdz']

[ad] 表示 字符 'a' 或者 字符 'd',所以匹配的结果是两个:'waz' 和 'wdz'。

目标2:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是 'a''b''c''d' 的全部的字符串,并返回结果。

这时候我们可以使用 [abcd] 这个字符集进行匹配。

结果如下:

>>> re.findall(r'w[abcd]z', s2)
['waz', 'wbz', 'wcz', 'wdz']

[abcd] 表示 字符 'a''b''c''d',这种情况可以在中括号中使用 - 号,表示从左侧字符开始到侧字符结束。如下:

>>> re.findall(r'w[a-d]z', s2)
['waz', 'wbz', 'wcz', 'wdz']

注意: [a-] 表示 'a'’-‘ 两个字符;[-d] 表示 ’-‘'d' 两个字符;必须 - 减号两侧都有字符,且左侧的字符编码小于右侧字符编码值时 - 才表示区间的特殊字符。

目标3:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是 数字 或 空格 的全部的字符串,并返回结果。

这时候我们可以使用 [0-9 ] 这个字符集进行匹配。

结果如下:

>>> re.findall(r'w[0-9 ]z', s2)
['w1z', 'w8z', 'w z']

匹配到三个结果。

目标4:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是 数字 或 小写英文字母 的全部的字符串,并返回结果。

这时候我们可以使用 [0-9a-z] 这个字符集进行匹配。

结果如下:

>>> re.findall(r'w[0-9a-z]z', s2)
['waz', 'wbz', 'wcz', 'wdz', 'wmz', 'w1z', 'w8z']

目标5:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是不是 数字 也不是 小写英文字母 的全部的字符串,并返回结果。

这时候我们可以使用 [^0-9a-z] 这个字符集进行匹配。 在 中括号 [] 中,如果字符集的第一个是 ^ 字符则表示不包括内部的字符集的其他字符集。

结果如下:

>>> re.findall(r'w[^0-9a-z]z', s2)
['w z', 'wAz']

目标6:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是不是 数字 也不是 小写英文字母 的全部的字符串,并返回结果。

这时候我们可以使用 [^0-9a-z] 这个字符集进行匹配。 在 中括号 [] 中,如果字符集的第一个是 ^ 字符则表示不包括内部的字符集的其他字符集。

结果如下:

>>> re.findall(r'w[^0-9a-z]z', s2)
['w z', 'wAz']

目标7:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是 任意字符 的全部的字符串,并返回结果。

这时候我们可以使用 . 这个特殊字符进行匹配。 . 用来匹配不包括 换行符 '\n' 在内的全部字符,如果要包含 换行符需要使用 DOTALL 匹配模式。

结果如下:

>>> re.findall(r'w.z', s2)
['waz', 'wbz', 'wcz', 'wdz', 'wmz', 'w1z', 'w8z', 'w z', 'wAz']

再看一个用 . 匹配全部字符的例子

>>> re.findall(r'w.z', 'waz wbz wcz w\nz w z wmz')
['waz', 'wbz', 'wcz', 'w z', 'wmz']
>>> re.findall(r'w.z', 'waz wbz wcz w\nz w z wmz', flags=re.DOTALL)
['waz', 'wbz', 'wcz', 'w\nz', 'w z', 'wmz']

当 re.findall() 函数的第三个参数传入 re.DOTALLre.S 时,此时的 . 可以匹配任意一个字符。

此时 'w\nz' 能够被成功匹配。

目标8:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是 数字 的全部的字符串,并返回结果。

这时候我们可以使用 [0-9] 进行匹配,也可以使用 \d 来匹配,或者使用 [\d] 进行匹配。

结果如下:

>>> re.findall(r'w\dz', s2)
['w1z', 'w8z']
>>> re.findall(r'w[0-9]z', s2)
['w1z', 'w8z']
>>> re.findall(r'w[\d]z', s2)
['w1z', 'w8z']

三者结果相同。

目标9:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符不是 数字 的全部的字符串,并返回结果。

这时候我们可以使用 [^0-9] 进行匹配,也可以使用 \D 来匹配,或者使用 [\D] 进行匹配。

结果如下:

>>> re.findall(r'w[^0-9]z', s2)
['waz', 'wbz', 'wcz', 'wdz', 'wmz', 'w z', 'wAz']
>>> re.findall(r'w\Dz', s2)
['waz', 'wbz', 'wcz', 'wdz', 'wmz', 'w z', 'wAz']
>>> re.findall(r'w[\D]z', s2)
['waz', 'wbz', 'wcz', 'wdz', 'wmz', 'w z', 'wAz']

目标10:

找出字符串 s2 中的全部数字的字符串,并返回结果。

这时候我们可以使用 [0-9]+ 进行匹配,也可以使用 \d+ 进行匹配。

结果如下:

>>> re.findall(r'[0-9]+', s2)
['1', '8', '666']
>>> re.findall(r'\d+', s2)
['1', '8', '666']
>>> re.findall(r'[\d]+', s2)
['1', '8', '666']

目标11:

找出字符串 s2 中以 'w' 开头,以 'z' 结尾,中间的一个字符是 空白字符 的全部的字符串,并返回结果。

这时候我们可以使用 [ \r\n\t\v\f] 进行匹配,也可以使用 \s 来匹配。\s用来匹配空白字符,包括[ \r\n\t\v\f]但不限于这些。

结果如下:

>>> re.findall(r'w\sz', s2)
['w z']
>>> re.findall(r'w[ \r\n\t\v\f]z', s2)
['w z']

特殊字符 \S 匹配非空白字符,等同于 [^\s], 就是空白字符以外的字符。

特殊字符 \w 匹配英文字母(大小写)、数字、中文字符等不包括标点符合等的字符。

特殊字符 \W 等同于 [^\w]