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
2116import re
22- m = re.search(' [0-9]' ,' abcd4ef' )
17+ m = re.search(' [0-9]' , ' abcd4ef' )
2318print (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
3935book1.txt
40-
4136book99.text
37+ ```
4238
4339都不会被选中。
4440
4541Perl中内建有正则表达式的功能,据说是所有正则表达式系统中最强的,这也是Perl成为系统管理员利器的一个原因。
4642
47-
48-
4943##正则表达式的函数
44+
5045``` python
5146m = re.search(pattern, string) # 搜索整个字符串,直到发现符合的子字符串。
5247m = 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-
1101002)重复
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
1361363 ) 位置
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
1491564)返回控制
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
158166import re
159167m = re.search(" output_(\d{4} )" , " output_1986.txt" )
160168print (m.group(1 ))
161169```
162170
163- 我们还可以将群命名,以便更好地使用` m.group ` 查询:
171+ 我们还可以将群命名,以便更好地使用` m.group ` 查询:
172+
164173``` python
165174import 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命名。
167176print (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处是匹配的整个字符串。
177192print m.group(0 ), m.group(1 )
193+ ```
194+
195+ ``` quote
178196abcd4ef 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