|
| 1 | +# 字符集 |
| 2 | + |
| 3 | + |
| 4 | +好了,通过上面的几个实例我们初步认识了 Python 的正则表达式,可能你就会问,正则表达式还有什么规则,什么字母代表什么意思呢? |
| 5 | + |
| 6 | +其实,这些都不急,在本章后面会给出对应的正则表达式规则列表,而且这些东西在网上随便都能 Google 到。所以现在,我们还是进一步加深对正则表达式的理解,讲一下正则表达式的字符集。 |
| 7 | + |
| 8 | +字符集是由一对方括号 “[]” 括起来的字符集合。使用字符集,可以匹配多个字符中的一个。 |
| 9 | + |
| 10 | +举个例子,比如你使用 `C[ET]O` 匹配到的是 CEO 或 CTO ,也就是说 `[ET]` 代表的是一个 E 或者一个 T 。像上面提到的 `[a-z]` ,就是所有小写字母中的其中一个,这里使用了连字符 “-” 定义一个连续字符的字符范围。当然,像这种写法,里面可以包含多个字符范围的,比如:`[0-9a-fA-F]` ,匹配单个的十六进制数字,且不分大小写。注意了,字符和范围定义的先后顺序对匹配的结果是没有任何影响的。 |
| 11 | + |
| 12 | +其实说了那么多,只是想证明,字符集一对方括号 “[]” 里面的字符关系是或关系,下面看一个例子: |
| 13 | + |
| 14 | +```Python |
| 15 | + |
| 16 | +import re |
| 17 | +a = 'uav,ubv,ucv,uwv,uzv,ucv,uov' |
| 18 | + |
| 19 | +# 字符集 |
| 20 | + |
| 21 | +# 取 u 和 v 中间是 a 或 b 或 c 的字符 |
| 22 | +findall = re.findall('u[abc]v', a) |
| 23 | +print(findall) |
| 24 | +# 如果是连续的字母,数字可以使用 - 来代替 |
| 25 | +l = re.findall('u[a-c]v', a) |
| 26 | +print(l) |
| 27 | + |
| 28 | +# 取 u 和 v 中间不是 a 或 b 或 c 的字符 |
| 29 | +re_findall = re.findall('u[^abc]v', a) |
| 30 | +print(re_findall) |
| 31 | + |
| 32 | +``` |
| 33 | + |
| 34 | +输出的结果: |
| 35 | + |
| 36 | +```txt |
| 37 | +['uav', 'ubv', 'ucv', 'ucv'] |
| 38 | +['uav', 'ubv', 'ucv', 'ucv'] |
| 39 | +['uwv', 'uzv', 'uov'] |
| 40 | +``` |
| 41 | + |
| 42 | +在例子中,使用了取反字符集,也就是在左方括号 “[” 后面紧跟一个尖括号 “^”,就会对字符集取反。需要记住的一点是,取反字符集必须要匹配一个字符。比如:`q[^u]` 并不意味着:匹配一个 q,后面没有 u 跟着。它意味着:匹配一个 q,后面跟着一个不是 u 的字符。具体可以对比上面例子中输出的结果来理解。 |
| 43 | + |
| 44 | +我们都知道,正则表达式本身就定义了一些规则,比如 `\d`,匹配所有数字字符,其实它是等价于 [0-9],下面也写了个例子,通过字符集的形式解释了这些特殊字符。 |
| 45 | + |
| 46 | +```Python |
| 47 | +import re |
| 48 | + |
| 49 | +a = 'uav_ubv_ucv_uwv_uzv_ucv_uov&123-456-789' |
| 50 | + |
| 51 | +# 概括字符集 |
| 52 | + |
| 53 | +# \d 相当于 [0-9] ,匹配所有数字字符 |
| 54 | +# \D 相当于 [^0-9] , 匹配所有非数字字符 |
| 55 | +findall1 = re.findall('\d', a) |
| 56 | +findall2 = re.findall('[0-9]', a) |
| 57 | +findall3 = re.findall('\D', a) |
| 58 | +findall4 = re.findall('[^0-9]', a) |
| 59 | +print(findall1) |
| 60 | +print(findall2) |
| 61 | +print(findall3) |
| 62 | +print(findall4) |
| 63 | + |
| 64 | +# \w 匹配包括下划线的任何单词字符,等价于 [A-Za-z0-9_] |
| 65 | +findall5 = re.findall('\w', a) |
| 66 | +findall6 = re.findall('[A-Za-z0-9_]', a) |
| 67 | +print(findall5) |
| 68 | +print(findall6) |
| 69 | + |
| 70 | +``` |
| 71 | + |
| 72 | +输出结果: |
| 73 | + |
| 74 | +```txt |
| 75 | +['1', '2', '3', '4', '5', '6', '7', '8', '9'] |
| 76 | +['1', '2', '3', '4', '5', '6', '7', '8', '9'] |
| 77 | +['u', 'a', 'v', '_', 'u', 'b', 'v', '_', 'u', 'c', 'v', '_', 'u', 'w', 'v', '_', 'u', 'z', 'v', '_', 'u', 'c', 'v', '_', 'u', 'o', 'v', '&', '-', '-'] |
| 78 | +['u', 'a', 'v', '_', 'u', 'b', 'v', '_', 'u', 'c', 'v', '_', 'u', 'w', 'v', '_', 'u', 'z', 'v', '_', 'u', 'c', 'v', '_', 'u', 'o', 'v', '&', '-', '-'] |
| 79 | +['u', 'a', 'v', '_', 'u', 'b', 'v', '_', 'u', 'c', 'v', '_', 'u', 'w', 'v', '_', 'u', 'z', 'v', '_', 'u', 'c', 'v', '_', 'u', 'o', 'v', '1', '2', '3', '4', '5', '6', '7', '8', '9'] |
| 80 | +['u', 'a', 'v', '_', 'u', 'b', 'v', '_', 'u', 'c', 'v', '_', 'u', 'w', 'v', '_', 'u', 'z', 'v', '_', 'u', 'c', 'v', '_', 'u', 'o', 'v', '1', '2', '3', '4', '5', '6', '7', '8', '9'] |
| 81 | +``` |
0 commit comments