Skip to content

Commit c7c4d7a

Browse files
committed
两点水
1 parent 8728a31 commit c7c4d7a

File tree

9 files changed

+506
-17
lines changed

9 files changed

+506
-17
lines changed

README.md

Lines changed: 79 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,83 @@
33
草根开发者学习Python(基于Python3.6)
44

55

6-
**通过本草根的博客整理而成,相应的博客地址**
6+
**通过本草根的博客整理而成,相应的博客地址,主要内容目录如下:**
77

8-
|博客文章|平台|
9-
|:----- |:------|
10-
|Python 代码规范 | [掘金](https://juejin.im/post/593ebd7eac502e006b520a8f)[简书](http://www.jianshu.com/p/8b6c425b65a6)[CSDN](http://blog.csdn.net/Two_Water/article/details/73153945)[个人博客](http://twowater.com.cn/2017/06/13/Python%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/)|
11-
|草根学Python(一)第一个Python程序|[掘金](https://juejin.im/post/594633e5ac502e006b9e1331)[简书](http://www.jianshu.com/p/0d757860c8cf)[CSDN](http://blog.csdn.net/Two_Water/article/details/73433637)[个人博客](http://twowater.com.cn/2017/06/18/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E4%B8%80-%E7%AC%AC%E4%B8%80%E4%B8%AAPython%E7%A8%8B%E5%BA%8F/)|
12-
|草根学 Python(二)基本数据类型和变量|[掘金](https://juejin.im/post/5946b7f25c497d006bef5704)[简书](http://www.jianshu.com/p/b5388a6c2e72)[CSDN](http://blog.csdn.net/Two_Water/article/details/73478060)[个人博客](http://twowater.com.cn/2017/06/19/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E4%BA%8C-%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%92%8C%E5%8F%98%E9%87%8F/)|
13-
|草根学 Python(三)List 和 Tuple|[掘金](https://juejin.im/post/593fdb87128fe1006a02ce92)[简书](http://www.jianshu.com/p/97c97d5a5a7c)[CSDN](http://blog.csdn.net/Two_Water/article/details/73524367)[个人博客](http://twowater.com.cn/2017/06/21/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E4%B8%89-List-%E5%92%8C-Tuple/)|
14-
|草根学Python(四) Dict 和 Set|[掘金](https://juejin.im/post/5947bf84ac502e5490e4a6a1)[简书](http://www.jianshu.com/p/90f5b897ce77)[CSDN](http://blog.csdn.net/two_water/article/details/73719026)[个人博客](http://twowater.com.cn/2017/06/25/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E5%9B%9B-Dict-%E5%92%8C-Set/)|
15-
|草根学Python(五) 条件语句和循环语句|[掘金](https://juejin.im/post/594c6c52f265da6c1f75f164)[简书](http://www.jianshu.com/p/2b80009b1e8c)[CSDN](http://blog.csdn.net/Two_Water/article/details/73762517)[个人博客](http://twowater.com.cn/2017/06/27/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E4%BA%94-%E6%9D%A1%E4%BB%B6%E8%AF%AD%E5%8F%A5%E5%92%8C%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5/)|
16-
|草根学Python(六) 函数|[掘金](https://juejin.im/post/5946784461ff4b006cf1d8ec)[简书](http://www.jianshu.com/p/d8f2a55edc75)[CSDN](http://blog.csdn.net/Two_Water/article/details/73865622)[个人博客](http://twowater.com.cn/2017/06/29/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E5%85%AD-%E5%87%BD%E6%95%B0/)|
17-
|草根学Python(七) 迭代器和生成器|[掘金](https://juejin.im/post/59589fedf265da6c386ce4ac)[简书](http://www.jianshu.com/p/74c0c1db1490)[CSDN](http://blog.csdn.net/Two_Water/article/details/74164652)[个人博客](http://twowater.com.cn/2017/07/02/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E4%B8%83-%E8%BF%AD%E4%BB%A3%E5%99%A8%E5%92%8C%E7%94%9F%E6%88%90%E5%99%A8/)|
18-
|草根学Python(八) 模块与包|[掘金](https://juejin.im/post/5962ddf95188252ec34009da)[简书](http://www.jianshu.com/p/7f05f915d2ac)[CSDN](http://blog.csdn.net/Two_Water/article/details/75042211)[个人博客](http://twowater.com.cn/2017/07/12/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E5%85%AB-%E6%A8%A1%E5%9D%97%E4%B8%8E%E5%8C%85/)|
19-
|草根学Python(九) 面向对象|[掘金](https://juejin.im/post/596ca6656fb9a06b9b73c8b0)[简书](http://www.jianshu.com/p/6ecaa414c702)[CSDN](http://blog.csdn.net/two_water/article/details/76408890)[个人博客](http://twowater.com.cn/2017/07/31/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E4%B9%9D-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/)|
20-
|草根学Python(十)Python 的 Magic Method|[掘金](https://juejin.im/post/59828c2f6fb9a03c56319baa)[简书](http://www.jianshu.com/p/345a80a02546)[CSDN](http://blog.csdn.net/two_water/article/details/77351516)[个人博客](http://twowater.com.cn/2017/08/18/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E5%8D%81-Python-%E7%9A%84-Magic-Method/)|
21-
|草根学Python(十一)枚举类|[掘金](https://juejin.im/post/599906a2f265da24722faec3)[简书](http://www.jianshu.com/p/c4d2629e5015)[CSDN](http://blog.csdn.net/Two_Water/article/details/77626179)[个人博客](http://twowater.com.cn/2017/08/28/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E5%8D%81%E4%B8%80-%E6%9E%9A%E4%B8%BE%E7%B1%BB/)|
22-
|草根学Python(十二)元类|[掘金](https://juejin.im/post/59aff224f265da2476426796)[简书](http://www.jianshu.com/p/9b10fcee7cda)[CSDN](http://blog.csdn.net/two_water/article/details/77877621)[个人博客](http://twowater.com.cn/2017/09/07/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E5%8D%81%E4%BA%8C-%E5%85%83%E7%B1%BB/)|
23-
|草根学Python(十三)线程和进程|[掘金](https://juejin.im/post/59cdbabb5188257a134abb6e)[简书](http://www.jianshu.com/p/9106092d554f)[CSDN](http://blog.csdn.net/Two_Water/article/details/78221478)[个人博客](http://twowater.com.cn/2017/10/13/%E8%8D%89%E6%A0%B9%E5%AD%A6Python-%E5%8D%81%E4%B8%89-%E7%BA%BF%E7%A8%8B%E5%92%8C%E8%BF%9B%E7%A8%8B/)|
8+
* [Python代码规范](/codeSpecification/codeSpecification_Preface.md)
9+
- [简明概述](/codeSpecification/codeSpecification_first.md)
10+
- [注释](/codeSpecification/codeSpecification_second.md)
11+
- [命名规范](/codeSpecification/codeSpecification_third.md)
12+
* [第一个Python程序](/python1/Preface.md)
13+
- [Python 简介](/python1/Introduction.md)
14+
- [Python 的安装](/python1/Installation.md)
15+
- [第一个 Python 程序](/python1/The_first_procedure.md)
16+
- [集成开发环境(IDE): PyCharm](/python1/IDE.md)
17+
* [基本数据类型和变量](/python2/Preface.md)
18+
- [Python 语法的简要说明](/python2/Grammar.md)
19+
- [Python 的基本数据类型](/python2/Type_of_data.md)
20+
- [基本数据类型转换](/python2/Type_conversion.md)
21+
- [Python 中的变量](/python2/Variable.md)
22+
* [List 和 Tuple](/python3/Preface.md)
23+
- [List(列表)](/python3/List.md)
24+
- [tuple(元组)](/python3/tuple.md)
25+
* [ Dict 和 Set](/python4/Preface.md)
26+
- [字典(Dictionary)](/python4/Dict.md)
27+
- [set](/python4/Set.md)
28+
* [条件语句和循环语句](/python5/Preface.md)
29+
- [条件语句](/python5/If.md)
30+
- [循环语句](/python5/Cycle.md)
31+
- [条件语句和循环语句综合实例](/python5/Example.md)
32+
* [函数](/python6/Preface.md)
33+
- [Python 自定义函数的基本步骤](/python6/1.md)
34+
- [函数传值问题](/python6/2.md)
35+
- [函数返回值](/python6/3.md)
36+
- [函数的参数](/python6/4.md)
37+
- [匿名函数](/python6/5.md)
38+
* [迭代器和生成器](/python7/Preface.md)
39+
- [迭代](/python7/1.md)
40+
- [Python 迭代器](/python7/2.md)
41+
- [lsit 生成式(列表生成式)](/python7/3.md)
42+
- [生成器](/python7/4.md)
43+
- [迭代器和生成器综合例子](/python7/5.md)
44+
* [模块与包](/python8/Preface.md)
45+
- [Python 模块简介](/python8/1.md)
46+
- [模块的使用](/python8/2.md)
47+
- [主模块和非主模块](/python8/3.md)
48+
- [](/python8/4.md)
49+
- [作用域](/python8/5.md)
50+
* [面向对象](/python9/Preface.md)
51+
- [面向对象的概念](/python9/1.md)
52+
- [](/python9/2.md)
53+
- [类的属性](/python9/3.md)
54+
- [类的方法](/python9/4.md)
55+
- [类的继承](/python9/5.md)
56+
- [类的多态](/python9/6.md)
57+
* [Python 的 Magic Method](/python10/Preface.md)
58+
- [Python 的 Magic Method](/python10/1.md)
59+
- [构造(`__new__`)和初始化(`__init__`)](/python10/2.md)
60+
- [属性的访问控制](/python10/3.md)
61+
- [对象的描述器](/python10/4.md)
62+
- [自定义容器(Container)](/python10/5.md)
63+
- [运算符相关的魔术方法](/python10/6.md)
64+
* [枚举类](/python11/Preface.md)
65+
- [枚举类的使用](/python11/1.md)
66+
- [Enum 的源码](/python11/2.md)
67+
- [自定义类型的枚举](/python11/3.md)
68+
- [枚举的比较](/python11/4.md)
69+
* [元类](/python12/Preface.md)
70+
- [Python 中类也是对象](/python12/1.md)
71+
- [使用 `type()` 动态创建类](/python12/2.md)
72+
- [什么是元类](/python12/3.md)
73+
- [自定义元类](/python12/4.md)
74+
- [使用元类](/python12/5.md)
75+
* [线程与进程](/python13/Preface.md)
76+
- [线程与进程](/python13/1.md)
77+
- [多线程编程](/python13/2.md)
78+
- [进程](/python13/3.md)
79+
* [一步一步了解正则表达式](/python14/Preface.md)
80+
- [初识 Python 正则表达式](/python14/1.md)
81+
- [字符集](/python14/2.md)
82+
- [数量词](/python14/3.md)
83+
- [边界匹配符和组](/python14/4.md)
84+
- [re.sub](/python14/5.md)
85+
- [re.match 和 re.search](/python14/6.md)

SUMMARY.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,10 @@
7272
- [线程与进程](/python13/1.md)
7373
- [多线程编程](/python13/2.md)
7474
- [进程](/python13/3.md)
75+
* [一步一步了解正则表达式](/python14/Preface.md)
76+
- [初识 Python 正则表达式](/python14/1.md)
77+
- [字符集](/python14/2.md)
78+
- [数量词](/python14/3.md)
79+
- [边界匹配符和组](/python14/4.md)
80+
- [re.sub](/python14/5.md)
81+
- [re.match 和 re.search](/python14/6.md)

python14/1.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# 初识 Python 正则表达式
2+
3+
正则表达式是一个特殊的字符序列,用于判断一个字符串是否与我们所设定的字符序列是否匹配,也就是说检查一个字符串是否与某种模式匹配。
4+
5+
Python 自 1.5 版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。
6+
7+
下面通过实例,一步一步来初步认识正则表达式。
8+
9+
比如在一段字符串中寻找是否含有某个字符或某些字符,通常我们使用内置函数来实现,如下:
10+
11+
```python
12+
# 设定一个常量
13+
a = '两点水|twowater|liangdianshui|草根程序员|ReadingWithU'
14+
15+
# 判断是否有 “两点水” 这个字符串,使用 PY 自带函数
16+
17+
print('是否含有“两点水”这个字符串:{0}'.format(a.index('两点水') > -1))
18+
print('是否含有“两点水”这个字符串:{0}'.format('两点水' in a))
19+
```
20+
21+
输出的结果如下:
22+
23+
```txt
24+
是否含有“两点水”这个字符串:True
25+
是否含有“两点水”这个字符串:True
26+
```
27+
28+
那么,如果使用正则表达式呢?
29+
30+
刚刚提到过,Python 给我们提供了 re 模块来实现正则表达式的所有功能,那么我们先使用其中的一个函数:
31+
32+
```python
33+
re.findall(pattern, string[, flags])
34+
```
35+
36+
该函数实现了在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回,具体操作如下:
37+
38+
```python
39+
40+
import re
41+
42+
# 设定一个常量
43+
a = '两点水|twowater|liangdianshui|草根程序员|ReadingWithU'
44+
45+
# 正则表达式
46+
47+
findall = re.findall('两点水', a)
48+
print(findall)
49+
50+
if len(findall) > 0:
51+
print('a 含有“两点水”这个字符串')
52+
else:
53+
print('a 不含有“两点水”这个字符串')
54+
55+
```
56+
57+
输出的结果:
58+
59+
```txt
60+
['两点水']
61+
a 含有“两点水”这个字符串
62+
```
63+
64+
从输出结果可以看到,可以实现和内置函数一样的功能,可是在这里也要强调一点,上面这个例子只是方便我们理解正则表达式,这个正则表达式的写法是毫无意义的。为什么这样说呢?
65+
66+
因为用 Python 自带函数就能解决的问题,我们就没必要使用正则表达式了,这样做多此一举。而且上面例子中的正则表达式设置成为了一个常量,并不是一个正则表达式的规则,正则表达式的灵魂在于规则,所以这样做意义不大。
67+
68+
那么正则表达式的规则怎么写呢?先不急,我们一步一步来,先来一个简单的,找出字符串中的所有小写字母。首先我们在 `findall` 函数中第一个参数写正则表达式的规则,其中 `[a-z]` 就是匹配任何小写字母,第二个参数只要填写要匹配的字符串就行了。具体如下:
69+
70+
```python
71+
72+
import re
73+
74+
# 设定一个常量
75+
a = '两点水|twowater|liangdianshui|草根程序员|ReadingWithU'
76+
77+
# 选择 a 里面的所有小写英文字母
78+
79+
re_findall = re.findall('[a-z]', a)
80+
81+
print(re_findall)
82+
83+
```
84+
85+
输出的结果:
86+
87+
```txt
88+
['t', 'w', 'o', 'w', 'a', 't', 'e', 'r', 'l', 'i', 'a', 'n', 'g', 'd', 'i', 'a', 'n', 's', 'h', 'u', 'i', 'e', 'a', 'd', 'i', 'n', 'g', 'i', 't', 'h']
89+
```
90+
91+
这样我们就拿到了字符串中的所有小写字母了。

python14/2.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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+
```

python14/3.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 数量词
2+
3+
来,继续加深对正则表达式的理解,这部分理解一下数量词,为什么要用数量词,想想都知道,如果你要匹配几十上百的字符时,难道你要一个一个的写,所以就出现了数量词。
4+
5+
数量词的词法是:{min,max} 。min 和 max 都是非负整数。如果逗号有而 max 被忽略了,则 max 没有限制。如果逗号和 max 都被忽略了,则重复 min 次。比如,`\b[1-9][0-9]{3}\b`,匹配的是 1000 ~ 9999 之间的数字( “\b” 表示单词边界),而 `\b[1-9][0-9]{2,4}\b`,匹配的是一个在 100 ~ 99999 之间的数字。
6+
7+
下面看一个实例,匹配出字符串中 4 到 7 个字母的英文
8+
9+
```Python
10+
import re
11+
12+
a = 'java*&39android##@@python'
13+
14+
# 数量词
15+
16+
findall = re.findall('[a-z]{4,7}', a)
17+
print(findall)
18+
```
19+
20+
输出结果:
21+
22+
```txt
23+
['java', 'android', 'python']
24+
```
25+
26+
注意,这里有贪婪和非贪婪之分。那么我们先看下相关的概念:
27+
28+
29+
贪婪模式:它的特性是一次性地读入整个字符串,如果不匹配就吐掉最右边的一个字符再匹配,直到找到匹配的字符串或字符串的长度为 0 为止。它的宗旨是读尽可能多的字符,所以当读到第一个匹配时就立刻返回。
30+
31+
懒惰模式:它的特性是从字符串的左边开始,试图不读入字符串中的字符进行匹配,失败,则多读一个字符,再匹配,如此循环,当找到一个匹配时会返回该匹配的字符串,然后再次进行匹配直到字符串结束。
32+
33+
上面例子中的就是贪婪的,如果要使用非贪婪,也就是懒惰模式,怎么呢?
34+
35+
如果要使用非贪婪,则加一个 `?` ,上面的例子修改如下:
36+
37+
```Python
38+
import re
39+
40+
a = 'java*&39android##@@python'
41+
42+
# 贪婪与非贪婪
43+
44+
re_findall = re.findall('[a-z]{4,7}?', a)
45+
print(re_findall)
46+
47+
```
48+
49+
输出结果如下:
50+
51+
```txt
52+
['java', 'andr', 'pyth']
53+
```
54+
55+
从输出的结果可以看出,android 只打印除了 andr ,Python 只打印除了 pyth ,因为这里使用的是懒惰模式。
56+
57+
当然,还有一些特殊字符也是可以表示数量的,比如:
58+
59+
60+
> `?`:告诉引擎匹配前导字符 0 次或 1 次
61+
>
62+
> `+`:告诉引擎匹配前导字符 1 次或多次
63+
>
64+
> `*`:告诉引擎匹配前导字符 0 次或多次
65+
66+
67+
把这部分的知识点总结一下,就是下面这个表了:
68+
69+
| 贪 婪 | 惰 性 | 描 述 |
70+
| ------- | ------- | ----------------------------- |
71+
|| ?? | 零次或一次出现,等价于{0,1} |
72+
| + | +? | 一次或多次出现 ,等价于{1,} |
73+
| * | *| 零次或多次出现 ,等价于{0,} |
74+
| {n} | {n}? | 恰好 n 次出现 |
75+
| {n,m} | {n,m}? | 至少 n 次枝多 m 次出现 |
76+
| {n,} | {n,}? | 至少 n 次出现 |

python14/4.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# 边界匹配符和组
2+
3+
将上面几个点,就用了很大的篇幅了,现在介绍一些边界匹配符和组的概念。
4+
5+
一般的边界匹配符有以下几个:
6+
7+
| 语法 | 描述 |
8+
| ---- | ------------------------------------------------ |
9+
| ^ | 匹配字符串开头(在有多行的情况中匹配每行的开头) |
10+
| $ | 匹配字符串的末尾(在有多行的情况中匹配每行的末尾) |
11+
| \A | 仅匹配字符串开头 |
12+
| \Z | 仅匹配字符串末尾 |
13+
| \b | 匹配 \w 和 \W 之间 |
14+
| \B | [^\b] |
15+
16+
分组,被括号括起来的表达式就是分组。分组表达式 `(...)` 其实就是把这部分字符作为一个整体,当然,可以有多分组的情况,每遇到一个分组,编号就会加 1 ,而且分组后面也是可以加数量词的。
17+
18+
此处本应有例子,考虑到篇幅问题,就不贴了

0 commit comments

Comments
 (0)