Skip to content

Commit 5214874

Browse files
committed
STL*.md:整体调整格式,如删除多余空行、整理代码块、修正标点符号。
1 parent 033bda8 commit 5214874

File tree

13 files changed

+478
-594
lines changed

13 files changed

+478
-594
lines changed

content/STL01.md

Lines changed: 80 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,77 @@
1-
#Python标准库01 正则表达式 (re包)
2-
3-
4-
1+
#Python标准库01 正则表达式(re包)
52

63
我将从正则表达式开始讲Python的标准库。正则表达式是文字处理中常用的工具,而且不需要额外的系统知识或经验。我们会把系统相关的包放在后面讲解。
74

8-
9-
10-
正则表达式(regular expression)主要功能是从字符串(string)中通过特定的模式(pattern),搜索想要找到的内容。
11-
5+
正则表达式(regular expression)主要功能是从字符串(string)中通过特定的模式(pattern),搜索想要找到的内容。
126

137
##语法
148

159
之前,我们简介了字符串相关的处理函数。我们可以通过这些函数实现简单的搜索功能,比如说从字符串“I love you”中搜索是否有“you”这一子字符串。但有些时候,我们只是模糊地知道我们想要找什么,而不能具体说出我是在找“you”,比如说,我想找出字符串中包含的数字,这些数字可以是0到9中的任何一个。这些模糊的目标可以作为信息写入正则表达式,传递给Python,从而让Python知道我们想要找的是什么。
1610

17-
(官方documentation)
11+
官方documentation
1812

1913
在Python中使用正则表达式需要标准库中的一个包`re`
14+
2015
```python
2116
import re
22-
m = re.search('[0-9]','abcd4ef')
17+
m = re.search('[0-9]', 'abcd4ef')
2318
print(m.group(0))
2419
```
20+
2521
`re.search()`接收两个参数,第一个`'[0-9]'`就是我们所说的正则表达式,它告诉Python的是,“听着,我从字符串想要找的是从`0``9`的一个数字字符”。
2622

2723
`re.search()`如果从第二个参数找到符合要求的子字符串,就返回一个对象`m`,你可以通过`m.group()`的方法查看搜索到的结果。如果没有找到符合要求的字符,`re.search()`会返回`None`
2824

29-
25+
如果你熟悉Linux或者Perl,你应该已经熟悉正则表达式。当我们打开Linux shell的时候,可以用正则表达式去查找或着删除我们想要的文件,比如说:
3026

31-
如果你熟悉Linux或者Perl, 你应该已经熟悉正则表达式。当我们打开Linux shell的时候,可以用正则表达式去查找或着删除我们想要的文件,比如说:
3227
```bash
3328
$rm book[0-9][0-9].txt
3429
```
35-
这就是要删除类似于`book02.txt`的文件。`book[0-9][0-9].txt`所包含的信息是,以`book`开头,后面跟两个数字字符,之后跟有`.txt`的文件名。如果不符合条件的文件名,比如说:
3630

37-
bo12.txt
31+
这就是要删除类似于`book02.txt`的文件。`book[0-9][0-9].txt`所包含的信息是,以`book`开头,后面跟两个数字字符,之后跟有`.txt`的文件名。如果不符合条件的文件名,比如说:
3832

33+
```quote
34+
bo12.txt
3935
book1.txt
40-
4136
book99.text
37+
```
4238

4339
都不会被选中。
4440

4541
Perl中内建有正则表达式的功能,据说是所有正则表达式系统中最强的,这也是Perl成为系统管理员利器的一个原因。
4642

47-
48-
4943
##正则表达式的函数
44+
5045
```python
5146
m = re.search(pattern, string) # 搜索整个字符串,直到发现符合的子字符串。
5247
m = re.match(pattern, string) # 从头开始检查字符串是否符合正则表达式。必须从字符串的第一个字符开始就相符。
5348
```
54-
可以从这两个函数中选择一个进行搜索。上面的例子中,我们如果使用`re.match()`的话,则会得到`None`,因为字符串的起始为`'a'`, 不符合`'[0-9]'`的要求。
5549

50+
可以从这两个函数中选择一个进行搜索。上面的例子中,我们如果使用`re.match()`的话,则会得到`None`,因为字符串的起始为`'a'`, 不符合`'[0-9]'`的要求。
5651

57-
对于返回的`m`, 我们使用`m.group()`来调用结果。(我们会在后面更详细解释`m.group()`
58-
59-
52+
对于返回的`m`,我们使用`m.group()`来调用结果。(我们会在后面更详细解释`m.group()`
6053

6154
我们还可以在搜索之后将搜索到的子字符串进行替换:
6255

63-
str = re.sub(pattern, replacement, string) # 在string中利用正则变换pattern进行搜索,对于搜索到的字符串,用另一字符串replacement替换。返回替换后的字符串。
64-
56+
```python
57+
str = re.sub(pattern, replacement, string) # 在string中利用正则变换pattern进行搜索。
58+
# 对于搜索到的字符串,用另一字符串replacement替换。返回替换后的字符串。
59+
```
6560

6661
此外,常用的正则表达式函数还有
6762

68-
re.split() # 根据正则表达式分割字符串, 将分割后的所有子字符串放在一个表(list)中返回
69-
70-
re.findall() # 根据正则表达式搜索字符串,将所有符合的子字符串放在一给表(list)中返回
71-
72-
73-
74-
(在熟悉了上面的函数后,可以看一下`re.compile()`,以便于提高搜索效率。)
63+
```python
64+
re.split() # 根据正则表达式分割字符串, 将分割后的所有子字符串放在一个表(list)中返回。
65+
re.findall() # 根据正则表达式搜索字符串,将所有符合的子字符串放在一给表(list)中返回。
66+
```
7567

76-
68+
(在熟悉了上面的函数后,可以看一下`re.compile()`,以便于提高搜索效率。)
7769

7870
##写一个正则表达式
7971

8072
关键在于将信息写成一个正则表达式。我们先看正则表达式的常用语法:
8173

82-
1)单个字符:
74+
1)单个字符
8375

8476
`.` 任意的一个字符
8577

@@ -105,89 +97,113 @@ re.findall() # 根据正则表达式搜索字符串,将所有符合的子字
10597

10698
`\W``[^0-9a-zA-Z]`
10799

108-
109-
110100
2)重复
111101

112-
紧跟在单个字符之后,表示多个这样类似的字符
102+
紧跟在单个字符之后,表示多个这样类似的字符
113103

114104
`*` 重复 >=0 次
115105

116106
`+` 重复 >=1 次
117107

118108
`?` 重复 0或者1 次
119109

120-
`{m}` 重复m次。比如说 a{4}相当于aaaa,再比如说`[1-3]{2}`相当于`[1-3][1-3]`
110+
`{m}` 重复m次。比如说 a{4}相当于aaaa,再比如说`[1-3]{2}`相当于`[1-3][1-3]`
121111

122112
`{m, n}` 重复m到n次。比如说`a{2, 5}`表示a重复2到5次。小于m次的重复,或者大于n次的重复都不符合条件。
123113

124-
125-
126-
正则表达 相符的字符串举例
114+
<table style="text-align:center">
115+
<tr>
116+
<td>正则表达</td>
117+
<td>相符的字符串举例</td>
118+
</tr>
127119

128-
`[0-9]{3,5}` 9678
120+
<tr>
121+
<td>`[0-9]{3,5}`</td>
122+
<td>9678</td>
123+
</tr>
129124

130-
`a?b` b
125+
<tr>
126+
<td>`a?b`</td>
127+
<td>b</td>
128+
</tr>
131129

132-
`a+b` aaaaab
133-
134-
130+
<tr>
131+
<td>`a+b`</td>
132+
<td>aaaaab</td>
133+
</tr>
134+
</table>
135135

136136
3) 位置
137137

138138
`^` 字符串的起始位置
139139

140140
`$` 字符串的结尾位置
141141

142-
143-
144-
正则表达 相符的字符串举例 不相符字符串
145-
146-
`^ab.*c$` abeec cabeec (如果用`re.search()`, 将无法找到。)
142+
<table>
143+
<tr>
144+
<td>正则表达</td>
145+
<td>相符的字符串举例</td>
146+
<td>不相符字符串</td>
147+
</tr>
147148

149+
<tr>
150+
<td>`^ab.*c$`</td>
151+
<td>abeec</td>
152+
<td>cabeec(如果用`re.search()`,将无法找到。)</td>
153+
</tr>
154+
</table>
148155

149156
4)返回控制
150157

151158
我们有可能对搜索的结果进行进一步精简信息。比如下面一个正则表达式:
152159

153160
`output_(\d{4})`
154161

155-
该正则表达式用括号`()`包围了一个小的正则表达式,`\d{4}`。 这个小的正则表达式被用于从结果中筛选想要的信息(在这里是四位数字)。这样被括号圈起来的正则表达式的一部分,称为群(group)
162+
该正则表达式用括号`()`包围了一个小的正则表达式,`\d{4}`。 这个小的正则表达式被用于从结果中筛选想要的信息(在这里是四位数字)。这样被括号圈起来的正则表达式的一部分,称为群group
156163
我们可以`m.group(number)`的方法来查询群。`group(0)`是整个正则表达的搜索结果,`group(1)`是第一个群……
164+
157165
```python
158166
import re
159167
m = re.search("output_(\d{4})", "output_1986.txt")
160168
print(m.group(1))
161169
```
162170

163-
我们还可以将群命名,以便更好地使用`m.group`查询:
171+
我们还可以将群命名,以便更好地使用`m.group`查询:
172+
164173
```python
165174
import re
166-
m = re.search("output_(?P<year>\d{4})", "output_1986.txt") #(?P<name>...) 为group命名
175+
m = re.search("output_(?P<year>\d{4})", "output_1986.txt") # (?P<name>...) 为group命名
167176
print(m.group("year"))
168177
```
169178

170-
对比`re.search``re.match`
171-
本节开头我们用`re.search`实现数字子串的提取;
172-
m = re.search('[0-9]','abcd4ef')
173-
使用`re.match`同样实现上述功能(提取数字子串),我们需要用到小括号`'()'`:
179+
##对比`re.search``re.match`
180+
181+
本节开头我们用`re.search`实现数字子串的提取:
182+
174183
```python
175-
m = re.match('.*([0-9]+).*','abcd4ef')
176-
# 注意,我们通过m.group(1)来获取数字字串,下标0处是匹配的整个字符串
184+
m = re.search('[0-9]', 'abcd4ef')
185+
```
186+
187+
使用`re.match`同样实现上述功能(提取数字子串),我们需要用到小括号`'()'`
188+
189+
```python
190+
m = re.match('.*([0-9]+).*', 'abcd4ef')
191+
# 注意,我们通过m.group(1)来获取数字字串,下标0处是匹配的整个字符串。
177192
print m.group(0), m.group(1)
193+
```
194+
195+
```quote
178196
abcd4ef 4
179197
```
180-
很明显,这里使用`match`方法要繁琐一些;体会两个方法的差异,搜索整个字符串中的子串使用`re.search`,而从头开始检查字符串是否符合正则表达式选用`re.match`;
181198

182-
练习
183-
有一个文件,文件名为`output_1981.10.21.txt`。下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几。将文件改名为`output_YYYY-MM-DD-W.txt`(`YYYY`:四位的年,`MM`:两位的月份,`DD`:两位的日,`W`:一位的周几,并假设周一为一周第一天)
199+
很明显,这里使用`match`方法要繁琐一些;体会两个方法的差异,搜索整个字符串中的子串使用`re.search`,而从头开始检查字符串是否符合正则表达式选用`re.match`
184200

185-
201+
##练习
186202

187-
203+
有一个文件,文件名为`output_1981.10.21.txt`。下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几。将文件改名为`output_YYYY-MM-DD-W.txt`(`YYYY`:四位的年,`MM`:两位的月份,`DD`:两位的日,`W`:一位的周几,并假设周一为一周第一天)。
188204

189205
##总结
190206

191207
`re.search()` `re.match()` `re.sub()` `re.findall()`
192208

193-
正则表达式构成方法
209+
正则表达式构成方法

0 commit comments

Comments
 (0)